任何人都可以解释我何时以及为什么要使用依赖注入?
哪个是DI的最佳方法?
当我搜索并发现许多框架时,其中一些如下: -
http://www.hanselman.com/blog/ListOf-NETDependencyInjectionContainersIOC.aspx
但我很困惑哪一个是最好的。
还有IOC和DI有什么区别?
这里有谁可以帮助我?
提前致谢。
答案 0 :(得分: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;
}
}
这很糟糕。 Customer
和Database
是tightly coupled。这意味着Customer
对Database
了解太多;它完全依赖于它。
如果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
接口和接口提供的方法。太好了!
但我很困惑哪一个是最好的。
对于像你我这样的人来说,这并不重要。他们都以略微不同的方式做同样的事情。除非你有理由选择其中一个,否则选择一个易于使用,受欢迎且有很多(社区)支持的理由。
我个人使用Castle Windsor。我听说过关于Ninject,Autofac,StructureMap和Unity的好消息。
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