C#使用Unity框架

C#使用Unity框架

轉載自:http://www.cnblogs.com/liujp/archive/2012/07/12/2587418.html

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; }
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章