Unity 应用程序块(Unity)是一个轻量级、可扩展的依赖注入容器,支持构造函数、属性和方法调用注入。

1.控制反转 (IoC) 模式,这是一种设计模式,它描述了用于支持对象可以“查找”它们需要的其他对象的实例的插件架构的技术。

2.依赖注入 (DI) 模式,这是 Ioc 模式的一种特殊情况,是一种基于改变对象的行为而不改变类的内部的接口编程技术。开发人员编写实现接口的类代码,并基于接口或者对象类型使用容器注入依赖的对象实例到类中。用于注入对象实例的技术是接口注入、构造函数注入、属性(设置器)注入和方法调用注入。

Unity 应用程序块使用容器注册类型和映射的两种方法如下:

A:RegisterType。此方法用容器注册一个类型。在适当的时候,容器将构建一个指定的类型的实例。这可以通过类的特性或者调用 Resolve 方法时初始化依赖注入。构建的对象的生命周期与在方法参数中指定的生命周期一致。如果没有指定生命周期的值,将为类型注册一个暂时的生命周期,这意味着容器将为每一个对 Resolve 的调用创建一个新的实例。

B:RegisterInstance。此方法将一个指定的类型的已存在的实例注册到容器,并带有指定的生命周期。容器将在生命周期内返回已有的实例。如果没有指定生命周期,实例将拥有容器控制的生命周期。下面将介绍注册实例的四种方式

(1)类型的配置容器注册

作为 RegisterType 和 Resolve 方法的重载的一个示例,下列代码注册了一个用于接口 IMyService 的映射,将指定容器将返回 CustomerService 类(实现了IMyService 接口)的实例。

IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IMyService, CustomerService>();
IMyService myServiceInstance = myContainer.Resolve<IMyService>();

(2)已有对象实例的配置容器注册

做为使用 RegisterInstance 和 Resolve 方法重载的一个示例,下列代码注册了实现了 IMyService 接口的 LoggingService 类的一个已有实例,然后获取此实例:

IUnityContainer myContainer = new UnityContainer();
LoggingService myExistingObject = new LoggingService();
myContainer.RegisterInstance<IMyService>(myExistingObject);
IMyService myServiceInstance = myContainer.Resolve<IMyService>();

(3)构造函数注入

做为构造函数注入的一个示例,如果开发人员用 Unity 容器的 Resolve 方法实例化的类有一个构造函数定义了一个或多个对其他类的依赖,Unity 容器将自动创建指定在构造函数参数中的依赖的对象实例。例如,下列代码展示了依赖于 LoggingService 对象的 CustomerService 类。

public class CustomerService
{
 public CustomerService(LoggingService myServiceInstance)
 {
  // work with the dependent instance
  myServiceInstance.WriteToLog("SomeValue");
 }
}

在运行时,开发人员使用容器的 Resolve 方法创建了 CustomerService 类的一个实例,这导致了实例生成框架将具体类 LoggingService 的一个实例注入到 CustomerService 类中。

IUnityContainer uContainer = new UnityContainer();
CustomerService myInstance = uContainer.Resolve<CustomerService>();

(4)属性(设置器)注入

除了前面描述的构造函数注入以外,Unity 应用程序块还支持属性和方法调用注入。下列代码示范了属性注入。ProductService 类暴露了一个引用另一个名为 SupplierData 类(没有定义在下列代码中)的实例的属性。要强制依赖对象的依赖注入,开发人员必须像下列代码中一样使用 Dependency 特性装饰属性的声明:

public class ProductService
{
 private SupplierData supplier;
 [Dependency]
 public SupplierData SupplierDetails
 {
  get { return supplier; }
  set { supplier = value; }
 }
}