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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM