DIP是依赖倒置原则:一种软件架构设计的原则(抽象概念)。依赖于抽象不依赖于细节
IOC即为控制反转(Inversion of Control):传统开发,上端依赖(调用/指定)下端对象,会有依赖,把对下端对象的依赖转移到第三方容器(工厂+配置文件+反射),能够程序拥有更好的扩展性,是DIP的具体实现方式,可以用来减低计算机代码之间的耦合度。
DI 即为依赖注入(Dependency Injection):
- 是实现IOC的手段和方法,就是能做到构造某个对象时,将依赖的对象自动初始化并注入 :
- 有三种注入方式:构造函数注入--属性注入--方法注入(按时间顺序):
- 构造函数注入用的最多,默认找参数最多的构造函数,可以不用特性,可以去掉对容器的依赖
Unity容器:是微软推出的IOC框架,使用这个框架,可以实现AOP面向切面编程,便于代码的后期维护,此外,这套框架还自带单例模式,可以提高程序的运行效率。
上面介绍了一下Unity,IOC,DI的概念,那我们项目中什么时候会使用Unity呢,总结分析得到如下情况:
- 所构建的系统依赖于健全的面向对象原则,但是大量不同的代码交织在一起而难以维护。
- 构建的对象和类需要依赖其他对象或类。
- 依赖于复杂的或需要抽象的对象。
- 希望利用构造函数、方法或属性的调用注入优势。
- 希望管理对象实例的生命周期。
- 希望能够在运行时管理并改变依赖关系。
- 希望在拦截方法或属性调用的时候生成一个策略链或管道处理容器来实现横切(AOP)任务。
- 希望在Web Application中的回发操作时能够缓存或持久化依赖关系。
使用Unity的好处:
- Unity支持简单对象创建,特别是分层对象结构和依赖,以简化程序代码。其包含一个编译那些可能存在依赖于其他对象的对象实例机制。
- Unity支持必要的抽象,其允许开发者在运行时或配置去指定依赖关系同时可以简单的管理横切点(AOP)。
- Unity增加了推迟到容器组件配置的灵活性。其同样支持一个容器层次的结构。
- Unity拥有服务定位能力,对于一个程序在许多情况下重复使用组件来分离和集中功能是非常有用的。
- Unity允许客户端储存或缓存容器。对于在ASP.NET Web applications中开发者将容器持久化于ASP.NET中的session或application中特别有效。
- Unity拥有拦截能力,其允许开发者通过创建并执行handlers(在方法或属性被调用到达之前)来为已存在的组件增加一个函数,并再次为返回调用结果。
- Unity可以从标准配置系统中读取配置信息,例如:XML文件,同时使用配置文件来配置容器。
- Unity支持开发者实现自定义容器扩展,例如:你可以实现方法来允许额外的对象构造和容器特征,例如缓存。
- Unity允许架构师和开发者在现代化的程序中更简单的实现通用设计模式
上面我们分析了unity使用的场景以及unity能够解决的问题,那下面我们来具体讲解一下如何使用unity。首先我们先准备一下基础类:
1:实体类,程序集和命名空间都是:Entity
1 namespace Entity 2 { 3 public class User 4 { 5 public string UserName { set; get; } 6 public int UserId { set; get; } 7 public string Password { get; set; } 8 } 9 } 10 namespace Entity 11 { 12 public class Role 13 { 14 public int Id { set; get; } 15 } 16 } 17 namespace Entity 18 { 19 public class Department 20 { 21 public int Id { set; get; } 22 public string Name { get; set; } 23 } 24 } 25 namespace Entity 26 { 27 public class Company 28 { 29 public string CompanyName { set; get; } 30 public int CompanyId { set; get; } 31 } 32 }
2:接口类,程序集和命名空间都是:IService
1 namespace IService 2 { 3 public interface ICompany 4 { 5 void RegCompany(Company company); 6 } 7 } 8 9 namespace IService 10 { 11 public interface IRepository<T> 12 { 13 int Insert(T t); 14 T LoadById(int id); 15 } 16 } 17 namespace IService 18 { 19 public interface IRole 20 { 21 int Insert(Role role); 22 } 23 } 24 25 namespace IService 26 { 27 public interface IUser 28 { 29 void RegUser(User user); 30 } 31 }