Som*_*mar 3 .net c# dependency-injection asp.net-mvc-4
任何人都可以解释我何时以及为什么要使用依赖注入?
哪个是DI的最佳方法?
当我搜索并发现许多框架时,其中一些如下: -
http://www.hanselman.com/blog/ListOf-NETDependencyInjectionContainersIOC.aspx
但我很困惑哪一个是最好的.
以及IOC和DI有什么区别?
谁在这里,谁可以帮助我?
提前致谢 .
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)
这是不好的. Customer和Database被紧密耦合.这意味着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接口和接口提供的方法.大!
但我很困惑哪一个是最好的.
对于像你我这样的人来说,这并不重要.他们都以略微不同的方式做同样的事情.除非你有一个理由,选择一个易于使用,受欢迎且有很多(社区)支持的理由.
就个人而言,我使用Castle Windsor.我听说过关于Ninject,Autofac,StructureMap和Unity的好消息.
IoC表示控制反转.
DI表示依赖注入.
依赖注入是实现控制反转的一种方式.也就是说,DI是IoC的一种技术.
在我们的一个Customer类的例子中,它是创建和管理一个Database对象.该Customer对象被控制的Database对象.
当我们实现依赖注入时,我们反转或反转该控制,以便在Database其他地方处理控制.
| 归档时间: |
|
| 查看次数: |
1824 次 |
| 最近记录: |