C#使用Unity框架
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; }
}
}