IoC的应用
所谓控制反转(Inversion of ControlIoC)简单地说就是应用本身不负责依赖对象的创建和维护而交给一个外部容器来负责这样控制权就由应用转移到了外部IoC容器控制权就实现了所谓的反转比如在类型A中需要使用类型B的实例而B实例的创建并不由A来负责而是通过外部容器来创建通过IoC的方式实现针对目标Controller的激活具有重要的意义
从Unity来认识IoC()
有时又将IoC称为依赖注入(Dependency InjectionDI)所谓依赖注入就是由外部容器在运行时动态地将依赖的对象注入到组件之中Martin Fowler在那篇着名的文章Inversion of Control Containers and the Dependency Injection pattern中将具体的依赖注入划分为三种形式即构造器注入属性(设置)注入和接口注入而我个人习惯将其划分为一种(类型)匹配和三种注入
类型匹配(Type Mapping)虽然我们通过接口(或者抽象类)来进行服务调用但是服务本身还是实现在某个具体的服务类型中这就需要某个类型注册机制来解决服务接口和服务类型之间的匹配关系
构造器注入(Constructor Injection)IoC容器会智能地选择和调用适合的构造函数以创建依赖的对象如果被选择的构造函数具有相应的参数IoC容器在调用构造函数之前解析注册的依赖关系并自行获得相应参数对象
属性注入(Property Injection)如果需要使用到被依赖对象的某个属性在被依赖对象被创建之后IoC容器会自动初始化该属性
方法注入(Method Injection)如果被依赖对象需要调用某个方法进行相应的初始化在该对象创建之后IoC容器会自动调用该方法
开源社区具有很有流行的IoC框架如Castle WindsorUnitySpringNETStructureMap和Ninject等Unity是微软Patterns& Practices部门开发的一个轻量级的IoC框架该项目在Codeplex上的地址为http://unitycodeplexcom/我们可以下载相应的安装包和开发文档在本书出版之时Unity的最新版本为出于篇幅的限制我们不可能对Unity进行详细的讨论但是为了让读者了解IoC在Unity中的实现我们写了一个简单的程序
创建一个控制台程序定义如下几个接口(IAIBIC和ID)和它们各自的实现类(ABCD)在类型A中定义了BC和D个属性其类型分别为接口IBIC和ID属性B在函数中被初始化意味着它会以构造器注入的方式被初始化属性C上应用了MicrosoftPracticesUnityDependencyAttribute特性意味着这是一个需要以属性注入方式被初始化的依赖属性属性D则通过方法Initialize初始化该方法上应用了特性MicrosoftPracticesUnityInjectionMethodAttribute意味着这是一个注入方法它会在A对象被IoC容器创建的时候会被自动调用
namespace UnityDemo
{
public interface IA { }
public interface IB { }
public interface IC { }
public interface ID {}
public class A : IA
{
public IB B { get; set; }
[Dependency]
public IC C { get; set; }
public ID D { get; set; }
public A(IB b)
{
thisB = b;
}
[InjectionMethod]
public void Initialize(ID d)
{
thisD = d;
}
}
public class B: IB{}
public class C: IC{}
public class D: ID{}
}
然后为该应用添加一个配置文件并定义如下一段关于Unity的配置这段配置定义了一个名称为defaultContainer的Unity容器并在其中完成了上面定义的接口和对应实现类之间映射的类型匹配
[] []