Enterprise Library - Unity Application Block 學習手冊

 

下面介紹如何使用依賴注入映射類型和映射。
 
接口類型作爲依賴識別符(Interface Types as Dependency Identifiers
作爲一個示例,如下代碼使用RegisterType和Resolve方法,傳入一個接口類型名稱,接口命名爲IMyService,並指定容器返回一個CustomerService類的實例(該類實現了IMyService接口)。其中,IMyService類型爲註冊類型,請求IMyService類型將返回CustomerService對象實例。代碼使用容器方法的泛型重載。
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IMyService, CustomerService>();
IMyService myServiceInstance = myContainer.Resolve<IMyService>();
 
此外,你也可以使用該方法的非泛型重載,如下代碼獲得相同結果。
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType(typeof(IMyService), typeof(CustomerService));
IMyService myServiceInstance = (IMyService)myContainer.Resolve(typeof(IMyService));
 
組合依賴識別符和註冊名稱(Combining Dependency Identifiers and Registration Names
如果相同的類型需要註冊多次,可以指定不同的名稱來區分每一個映射。接着通過制定名稱和已註冊的類型來獲取合適的實例。下面的代碼演示瞭如何爲同一個接口類註冊兩次映射,然後Unity容器根據傳入給Resolve方法的類型和名稱,返回恰當的對象類型。
// Create container and register types
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IMyService, DataService>("Data");
myContainer.RegisterType<IMyService, LoggingService>("Logging");
 
// Retrieve an instance of each type
IMyService myDataService = myContainer.Resolve<IMyService>("Data");
IMyService myLoggingService = myContainer.Resolve<IMyService>("Logging");
 
已存在對象實例的依賴識別符和BuildUp方法(Dependency Identifier for Existing Objects and the BuildUp Method
Unity 容器提供了RegisterInstance 方法,允許註冊依賴注入映射 – 返回對單一已存在對象實例的引用。這一方法接收一個類型參數(對象接口或類型)和一個已存在的對象實例。當然,如果對同一類型有多個註冊,還需要提供不同的命名進行區分。
下面的代碼演示如何使用RegisterInstance 方法註冊實現了IMyService接口的、已存在的對象實例。下面的代碼同時使用了泛型和非泛型的容器方法。
DataService myDataService = new DataService();
EmailService myEmailService = new EmailService();
LoggingService myLoggingService = new LoggingService();
 
// Create container and register existing object instance
IUnityContainer myContainer = new UnityContainer();
 
myContainer.RegisterInstance<IMyService>(myDataService);
myContainer.RegisterInstance<IMyService>("Email", myEmailService);
myContainer.RegisterInstance(typeof(IMyService), "Logging", myLoggingService);
 
// Retrieve an instance of each type
IMyService theDataService = myContainer.Resolve<IMyService>();
IMyService theEmailService = myContainer.Resolve<IMyService>("Email");
IMyService theLoggingService
 = (IMyService)myContainer.Resolve(typeof(IMyService), "Logging");
 
BuildUp方法一個接口或對象類型做法註冊標識符,還接收一個已存在對象,並及時應用依賴注入機制。下面的代碼演示如何使用BuildUp 方法,爲已存在對象實例myDataService和myLoggingService應用依賴注入,這些對象實例實現了IMyService 接口。下面的演示同時使用了Unity容器的泛型和非泛型方法。
IMyService myDataService = new DataService();
IMyService myLoggingService = new LoggingService();
IMyService builtupDataService = myContainer.BuildUp<IMyService>( myDataService);
IMyService builtupLoggingService
  = (IMyService)myContainer.BuildUp(typeof(IMyService), myLoggingService);
 
通過依賴標識符檢索所有已註冊類型(Resolving a List of All Registered Types by Dependency Identifiers
可以通過使用容器的ResolveAll 方法,返回指定類型的所有註冊對象列表。該方法接收接口或者類型參數,返回IEnumerable對象實例,包含了所有該類型已註冊對象的引用(不含默認映射)。ResolveAll方法返回的列表中僅僅包含命名的實例註冊。
 
下面的代碼演示如何檢索指定註冊類型的所有已註冊類型。
// Create container and register types using a name for each one
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<IMyService, DefaultService>();
myContainer.RegisterType<IMyService, DataService>("Data");
myContainer.RegisterType<IMyService, LoggingService>("Logging");
 
// Retrieve a list of non-default types registered for IMyService
// List will only contain the types DataService and LoggingService
IEnumerable<IMyService> serviceList = myContainer.ResolveAll<IMyService>();
 
需要注意的是,如果你希望使用ResolveAll方法返回所有映射的類型,必須在註冊類型映射時,同時傳入註冊類型和一個名稱字符串。也就是,必須使用RegisterType和 RegisterInstance方法的重載,傳入一個名稱(字符串)和依賴類型。這是Unity 的內置設計,要麼使用命名的映射,要麼僅僅使用默認的映射。
 
http://www.entlib.com專業ASP.NET電子商務平臺小組,歡迎你繼續訪問Unity Application Block學習手冊。
 
參考文檔:
Unity Application Block Hands-On Labs for Enterprise Library
發佈了56 篇原創文章 · 獲贊 2 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章