大部分企业应用开发和互联网项目的开发都在应用IOC框架。
但是大部分时候,我们也就是这么用用,很少人有去考虑用的到底对不对,合适不合适。
大家都知道依赖倒置原则,这里给出定义:
高层模块不能依赖于底层模块,两者都应该依赖于抽象。
是不是有点颠覆三观!! 难道业务层不应该依赖数据访问层吗。难道是数据访问层依赖业务层吗?
下面是一个最常见的设计,业务层依赖 数据访问层,远程调用,文件访问,log模块等等:
这种设计被称之为 Naive Design。 一旦业务层依赖的任何一个模块发生变化,都会影响到业务层。变化通常是引入错误的原因。
那么我们以依赖倒置的原则来重新设计,得到下图中的结构:
这样是不是业务层就非常独立了。
但是,是不是有点晕了。这是怎么做到的呢? 来看一段简单的示例:
namespace Business { public class OrderService { private readonly IOrderRepository _orderRepository; public OrderService(IOrderRepository orderRepository) { _orderRepository = orderRepository; } public Void CreateOrder() { var order = new Order(); _orderRepository.SaveOrder(order); } } }
这段代码表示创建订单时,调用数据访问层把order对象持久化。
再来看一下项目结构:
可以看到 Business 没有依赖任何工程,DataAccess依赖了Business,Client也就是OrderService的调用方,同时依赖了Business和DataAccess。
你可能已经注意到了, IOrderRepository的接口定义在Business中,而在DataAccess中实现了这个接口。这样就实现了依赖倒置。这样做有什么好处呢,因为IOrderRepository接口的使用是Business提出来的,它只需要知道我要使用这个接口,而不用关心实现,这样就把实现的变化封装在了DataAccess中。这也体现了OO设计中最重要的两个原则:封装变化,面向接口编程。
在使用OrderService的地方,也就是client中,我们创建一个OrderRepository,并作为OrderService的参数传入。代码如下:
static void Main(string[] args) { var orderRepository = new OrderRepository(); var orderService = new OrderService(orderRepository); }
为什么不让OrderService自己创建OrderRepository呢?这样明显会导致双向依赖么。
每次创建OrderService的时候都要new一下OrderRepository,烦不烦。于是就有了IOC框架,帮我们自动创建一个OrderRepository,并注入OrderService。
回头再想想,如果你的项目是正向依赖关系。用IOC框架有意义么? 达到解耦的目的了么?
相关推荐
对多种IOC框架进行比较,对各自的优缺点进行描述
IOC框架详解,很好的IOC的参考资料,相信介绍了IOC框架
根据Spring的IoC原理,实现自己的IoC框架。
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
spring_ioc框架学习文档
C#实现的IOC和AOP框架,供学习
Android进阶——框架打造之IOC框架 实现通过Id找到控件的功能 实现通过Id找到Color、String资源 实现绑定view的点击事件、长按事件 实现绑定SetContentView 实现绑定网络的检测功能
简单的ioc框架, just a simple
轻量级的IOC框架,用于取代Spring在j2se项目中进行使用。
1、Flex IOC 框架概览PDF完整版 2、Flex IOC 框架概览配套源码 3、IoC容器和Dependency Injection模式中文版
自己动手做框架——ORM,MVC,IOC框架及整合视频教程 源码
Spring Actionscript IOC Flex Cairngorm MVC
Spring Ioc 注解 依赖注入
IoC 依赖注入 技术总结 IoC 依赖注入 技术总结
Spring IoC加载流程讲解以及IoC思想和依赖倒置原则
本文实例讲述了PHP面向对象五大原则之依赖倒置原则(DIP)。分享给大家供大家参考,具体如下: 什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于下层模块,它们共同...
简单实现Android的findviewbyid IOC框架
Inversion of control,缩写为IoC),也叫做依赖注入(Dependency Injection,简称DI),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。用户仅需要将这个XML描述以文件或字符串形式交给...
1自动注入框架(只需要继承框架内的application既可) 2图片加载框架(多重缓存,自动回收,最大限度保证内存的安全性) 3网络请求模块(继承了基本上现在所有的http请求) 4 eventbus(集成一个开源的框架) 5验证...