但愿给你3-5分钟的碎片化学习,多是坐地铁、等公交,聚沙成塔,水滴石穿,谢谢关注。数据库
1.1什么是依赖app
咱们先看下图框架
能够简单理解,一个HomeController类使用到了DBContext类,而这种关系是有偶然性,临时性,弱关系的,可是DBContext的变化会影响到HomeController函数
1.2显示依赖和隐式依赖单元测试
先看显示依赖代码:学习
显示依赖经过构造函数,很清楚的描述了HomeController类都依赖了哪些对象,这样就能够很好的管理这些依赖。而隐式依赖的缺点恰好就是显示依赖的优势。咱们看下面的隐式依赖:测试
若是一个类有上千行代码,处处都充斥着该类型的代码,这些代码就像隐藏的病毒同样,无处不在,能够想象后续的变化和修改是多么的恐怖。编码
1.3依赖倒置3d
依赖倒置的概念其实很简单,一句话就讲完了:咱们要依赖抽象,而不依赖具体实现。什么是抽象?好比接口,抽象类就是。对象
依赖抽象的目的是什么?封装变化!由于全部实现接口的实现均可以互相替换。
如上图所示,当数据库DapperUserRepository切换到EfUserRepository,对HomeController类能够无需任何修改,就能够平滑切换过去。反之,则更改的面就会很是大。
再看下面的代码,OrderController依赖接口IUserRepository就是依赖倒置的表现。
也许你会说,个人变化没有那么频繁,不须要那么麻烦。那么你是否考虑过,有可能本身的代码须要进行单元测试?若是存在这种可能,那么依赖注入是你必需要作的事。
2.1控制反转
咱们再看下面这个代码的问题
虽然OrderController依赖的是接口IUserRepository,知足依赖倒置原则,可是构造函数却依赖的是具体实现类UserRepository,这种作法属于硬编码,仍然没法知足将来变化带来的修改,怎么办?接下来咱们来说控制反转这个相对难以理解的概念。
先说反转,到底反转的是什么?咱们知道OrderController依赖的对象UserRepository是在构造函数内的生成的。如何可以把该对象的生成交给外部去决定生成呢?能够的!这种转移对象生成的方式就是控制反转。
简而言之,反转的是控制权,即依赖对象生成的控制权。是本身决定生成仍是交由别人去决定生成。
因此上面的代码,修改以下:
以上的代码才达到真正的控制反转,UserRepository对象的生成彻底交由外部进行控制,交给变化去控制。
这样有什么好处呢?交给外部生成的最大好处是想要生成什么对象能够自由控制,这样仍是为了未来对象生成的可替换,好比数据库访问对象的变动;单元测试的实现类替换等等。
这里借用大内老A一句话作为总结:所谓控制反转就是将对应流程的控制权转移到框架里。它体现的意思是控制权的转移,即原来控制权在A手中,如今须要B来接管。IoC涉及的所谓控制能够理解为“针对流程的控制”。
2.2单元测试
有了上面的控制反转,咱们的单元测试就方面不少了。
咱们能够看到,在数据库没法链接的时候,咱们可使用MemoryUserRepository进行替换单元测试,很是方便。
我是IT人张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注