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

Som*_*mar 3 .net c# dependency-injection asp.net-mvc-4

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

哪个是DI的最佳方法?

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

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

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

以及IOC和DI有什么区别?

谁在这里,谁可以帮助我?

提前致谢 .

Row*_*man 6

依赖注入

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

例如,假设我们有一个类Customer.一个Customer目标是能够从一个数据库中检索信息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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是不好的. CustomerDatabase紧密耦合.这意味着Customer太了解Database; 它完全依赖于它.

如果Database对象具有更多的构造要求,则问题会恶化.

想象一下:

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

    return db.GetCustomer(this.Id).Details;
}
Run Code Online (Sandbox Code Playgroud)

这更糟糕.现在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

使用哪个DI容器?

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

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

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

IoC vs DI

IoC表示控制反转.

DI表示依赖注入.

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

在我们的一个Customer类的例子中,它是创建和管理一个Database对象.该Customer对象被控制Database对象.

当我们实现依赖注入时,我们反转或反转该控制,以便在Database其他地方处理控制.