哪个是Asp.Net MVC 4.0或更高版本中依赖注入的最佳方法?

时间:2014-06-25 05:54:46

标签: c# .net asp.net-mvc-4 dependency-injection

任何人都可以解释我何时以及为什么要使用依赖注入

哪个是DI的最佳方法?

当我搜索并发现许多框架时,其中一些如下: -

http://www.hanselman.com/blog/ListOf-NETDependencyInjectionContainersIOC.aspx

但我很困惑哪一个是最好的。

还有IOC和DI有什么区别?

这里有谁可以帮助我?

提前致谢。

3 个答案:

答案 0 :(得分:6)

依赖注入

OOP中的对象通常依赖于其他对象。也就是说,类会引用其他类,因为它们需要使用它们来完成它们的工作。

例如,假设我们有一个班级CustomerCustomer对象能够使用GetDetails()方法从数据库中检索详细信息。

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Customer()
    {

    }

    public void GetDetails()
    {
        Database db = new Database();

        return db.GetCustomer(this.Id).Details;
    }
}

这很糟糕。 CustomerDatabasetightly coupled。这意味着CustomerDatabase了解太多;它完全依赖于它。

如果Database对象具有更多构造要求,则问题会更加严重。

想象一下:

public void GetDetails()
{
    Database db = new Database("localhost", "3306", "username", "password", "database");

    return db.GetCustomer(this.Id).Details;
}

情况更糟。现在,Customer班级正在做更多事情。如果每个类都在创建一个Database对象,那么这很快就会变得难看。如果Database类发生更改,这很难维护并且代码会中断。假设我们不再需要在构造对象时提及端口,或者我们可能会添加一些参数。

最终,Customer不应该对数据库了解太多。真的,它并不关心。它只是想使用数据库。

让我们改变我们的Customer以使用依赖注入。

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    private IDatabase db { get; set; }

    public Customer(IDatabase db)
    {
        this.db = db;
    }

    public void GetDetails()
    {
        return db.GetCustomer(this.Id).Details;
    }
}

这种技术称为构造函数注入。我们通过构造函数 注入 依赖。现在Customer不知道进入什么类型的数据库,它是如何创建的或者它真正的任何东西。所有Customer都知道它符合IDatabase接口和接口提供的方法。太好了!

使用哪个DI容器?

  

但我很困惑哪一个是最好的。

对于像你我这样的人来说,这并不重要。他们都以略微不同的方式做同样的事情。除非你有理由选择其中一个,否则选择一个易于使用,受欢迎且有很多(社区)支持的理由。

我个人使用Castle Windsor。我听说过关于Ninject,Autofac,StructureMap和Unity的好消息。

IoC vs DI

IoC 表示控制反转

DI 表示依赖注入

依赖注入是实现控制反转的一种方式。也就是说,DI是一种IoC技术。

在我们的Customer类示例中,它正在创建和管理Database对象。 Customer对象控制 Database对象。

当我们实施依赖注入时,我们反转或反转,这种控制使得Database的控制权在其他地方得到处理。

答案 1 :(得分:3)

<强>为什么吗

使(例如)控制器可测试。

如何

通过构造函数将所有外部依赖项(如数据库访问)注入控制器。

此原则称为依赖注入,您并不需要容器/框架来使用它。 事实上对于我从未做过的小项目(对我来说开销有点重) - 我只是使用这样的东西:

public class MyController : Controller
{
    private readonly IDependency _dependency;

    public MyController ()
        : this(new ActuallImplementationOfDependency())
    {
    }

    public MyController (IDependency dependency)
    {
        _dependency = dependency;
    }
    // ...

}

答案 2 :(得分:1)

but I'm very confused that which one is the best.

嗯,这完全取决于项目的要求和可行性。例如,为了更快的性能简单的进样器是最好的,Unity广泛用于MVC,而动态代理可以用于Castle windsor。

您可以找到整个分析here