依赖注入和控制反转
如果您只是想了解一下这个词汇,你可以略过这个URL
但是如果您想深入了解,并写出自己的一个简单demo:您需要了解 一下反射以及如何使用反射创建对象
这个概念网上已经有很多了,但是理解从来都是融会贯通的过程,我也只是写下自己的看法,误人子弟之初还请指出。
先装个比,看看wiki上怎么说的 - ,- 直接copy了, 详细的地址 https://en.wikipedia.org/wiki/Dependency_injection
In software engineering,dependency injection is a technique whereby one object (or static method) supplies the dependencies of another object. A dependency is an object that can be used (a service). An injection is the passing of a dependency to a dependent object (a client) that would use it. The service is made part of the client's state. Passing the service to the client, rather than allowing a client to build or find the service,. is the fundamental requirement of the pattern.
这段话我们先不来解释,
这边我们把依赖注入分为两个部分来理解 :第一依赖,第二注入,
Part One
依赖最直接的体现就是两个类之间的引用比如我们要写一个从数据库读取Book信息的程序,
根据最简单的分层我们分了UI(Mvc),DAL层, UI层通过调用DAL的getBybookId()方法来获取,
如果BookController要调用BookDal层那就需要添加BookDal,这里就是我理解的依赖,也就是英文里的那一段one object (or static method) supplies the dependencies of another object. 下面我们把这段代码伪实现一下~,~
//bookDal用于实现查询数据库,实现各种Book的业务逻辑比如 getbookbyid,getbooklist,getbookbyname等
public class BookDal{
public Book getBybookId(int id);
}
public class BookController{
private readonly BookDal _bookDal;//添加bookDal的引用
public BookController(){
_bookDal=new BookDal();//实例化bookDal
}
//返回book视图
public View BookView(int id){
return View(_bookDal.getBybookId(id));
}
}
上述的代码也就是以前用的分层架构,按照以前三层的通常我们会加一个BLL层 然后通过工厂的模式,去创建Dal的对象,
不管是在mvc还是Bll层,我们都省略不了一个创建依赖对象的步骤,并且这个步骤使我们自己去管理的,
以上只是随便写了一个demo,通常现实和理想的差距就是,大型项目中我们可能要涉及很多的业务逻辑,如果有100个,1000个那我们是否还需要去自己管理?
当然,条条道路通罗马,这毕竟也是一种方法,
但是,现在有个很好的消息,我有个万能的Container(容器),他的全名叫做依赖注入容器,使用方法就是把你要依赖的对象通过注入的方式(注入这个词就看大家的理解了,我就暂且理解成传入了另外大家可以了解注入的三种方式),
然后我们在理解一句wiki英文:A dependency is an object that can be used (a service),这句话我确实不知道怎么解释才好,暂且理解为依赖是一个对象,他可以被当作服务使用
说到这里,我们解释了依赖注入,说完整应该是,我们依赖的对象 注入到 容器 ;
// TODO 这里依赖注入的demo大家可以通过各种语言,各种框架去实现
理解了依赖注入,就可以很简单的理解控制反转了;
Part Tow
下面我们说说控制反转(这里还是我自己的理解),如果您已经完成了 TODO 那您应该了解到了注入的方式:构造函数注入,setter注入,接口注入
平时用的比较多的算是构造函数注入了,我们继续拿上面的那段代码修改,
public class BookService{
public Book getBybookId(int id);
}
public class BookController{
private readonly BookService _bookDal;
public BookController(BookService bookService){
_bookDal=bookService;
}
//返回book视图
public View BookView(int id){
return View(_bookDal.getBybookId(id));
}
}
我们通过构造函数注入的方式,在创建BookController的时候,容器就把这个依赖的对象传递给我们了,
我们把创建对象的权利交给了依赖注入容器,而不是我们自己去创建管理对象(只能这样编了。。。)
然后这句话的理解:控制 对象 创建的权利被 反转给了容器
分割线,这就是我对这八个大字的简答理解了