通常,你主要使用下列2種方法之一來建立企業庫對象執行個體。
1.使用Unity伺服器定位器(Using the Unity Service Locator):這是最簡單的方法,如果你的應用只
有少量依賴,並且你不想使用現在的架構模式例如依賴注入,那麼推薦使用這種方法。 它不需要初始化和設定。你只需配置你的應用使用企業庫,然後調用服務定位器的方法來擷取需要類型的企業庫執行個體。
2.直接通過Unity容器。這個比較複雜的方法使你為你的層、組件、自訂類型通過現在架構模式例如依
賴注入獲得全部的好處。它只需少量的配置,但需要在應用中保持對容器的引用。
你可以使用的其他方法:
1.如果你決定使用不同於Unity的容器,你可以使用其他服務定位器。
2.在之前的版本中使用傳統的靜態門面(static facades )和工廠
使用Unity伺服器定位器:
建立企業庫對象最簡單的方法就是通過服務定位器建立需要的對象執行個體,而不是將他們注入到你的應用對像中。服務定位器實際上就是容器的封裝,暴露一系列用來返回基於註冊和映射的適當類型執行個體的方法。通過名稱從資料訪問模組獲得執行個體C# </p><p>Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("mydatabase");<br />db.ExecuteNonQuery("DoSomethingInteresting");</p><p>Visual Basic<br />Dim db As Database = EnterpriseLibraryContainer.Current.GetInstance(Of Database)("mydatabase")<br />db.ExecuteNonQuery("DoSomethingInteresting")</p><p>
直接存取Unity容器:
基本原則是代替獲得你需要的對象,而是接收他們作為輸入。一個容器,它基本上是一個用於儲存類型註冊和
映射和執行個體化請求類型的機制。當你的應用程式代碼的請求(或解決)介面,一個基類,或通過定義一個依賴於該
類型的具體類型時,它被配置為返回一個適當類型的執行個體。
當使用依賴注入的時候你不需要明確請求執行個體;相反依賴注入機制決定需要的執行個體並注入它。依賴注入將你從
必須建立所有依賴對象並將他們傳到指定目標中解脫出來。依賴注入容器為你建立對象,確定依賴關係。
如果你接受依賴注入的工作方式,或者你想通過容器來管理其周期,或者建立並修改類型註冊和映射,你可以
專門建立一個容器並配置它。這意味著您可以解決您的應用程式中除了企業庫對象之外的其他對象,例如使用者介面
組件、試圖模型、業務對象。
企業庫提供EnterpriseLibraryCoreExtension 容器的擴充,可以很方便的用企業庫配置資訊來初始化和填充默
認的Unity容器。下例執行個體化一個新的Unity容器並添加擴充,使所有的企業庫註冊和映射都可用。
C#<br />var container = new UnityContainer().AddNewExtension<EnterpriseLibraryCoreExtension>();</p><p>Visual Basic<br />Dim container = New UnityContainer().AddNewExtension(Of EnterpriseLibraryCoreExtension)();
依賴注入樣本:
通常,當您直接存取容器將受益於依賴注入,你將用它來解決自己的具體類,容器將注入企業庫對象以及與所有其他對象和依賴.
下面的例子顯示TaxCalculator類型具有兩個依賴 ExceptionManager和LogWriter. C#<br />public class TaxCalculator<br />{<br /> private ExceptionManager _exceptionManager;<br /> private LogWriter _logWriter;</p><p> public TaxCalculator(ExceptionManager em, LogWriter lw)<br /> {<br /> this._exceptionManager = em;<br /> this._logWriter = lw;<br /> }<br />}</p><p>Visual Basic<br />Public Class TaxCalculator</p><p> Private _exceptionManager As ExceptionManager<br /> Private _logWriter As LogWriter</p><p> Public Sub New(em As ExceptionManager, lw As LogWriter)<br /> Me._exceptionManager = em<br /> Me._logWriter = lw<br /> End Sub</p><p>End Class<br />
當您有一個容器的引用,你可以用它來解決具體的對象,如TaxCalculator。
C#<br />TaxCalculator calc = container.Resolve<TaxCalculator>();</p><p>Visual Basic<br />Dim calc As TaxCalculator = container.Resolve(Of TaxCalculator)()
容器會自動填滿的解決執行個體中所有的依賴關係。如果TaxCalculator類被定義為另一種類型的依賴。當他的
父類被解析時,ExceptionManager和LogWriter將自動建立並注入。
非靜態執行個體和執行個體工廠
所有的應用程式塊包含非靜態執行個體和非靜態工廠取代5.0版本以前的靜態方法和執行個體工廠.新的非靜態執行個體和工廠類
不能直接執行個體化.
非晶態執行個體和工廠樣本:
下面的樣本使用GetInstance方法從異常處理應用模組獲得ExceptionManager執行個體,並調用它的方法。C#<br />ExceptionManager em = EnterpriseLibraryContainer.Current.GetInstance<ExceptionManager>();<br />em.Process( () => MethodThatMightThrow(), "My Exception Policy");</p><p>Visual<br />Dim em As ExceptionManager = EnterpriseLibraryContainer.Current.GetInstance(Of ExceptionManager)();<br />em.Process(AddressOf MethodThatMightThrow, "My Exception Policy");<br />
下面的樣本使用GetInstance方法從驗證應用模組獲得ValidatorFactory執行個體,並使用它建立一個對象來驗證 Customer的成員。C#<br />ValidatorFactory factory = EnterpriseLibraryContainer.Current.GetInstance<ValidatorFactory>();<br />Validator<Customer> customerValidator = factory.CreateValidator<Customer>();</p><p>Customer myCustomer = new Customer("A name that is too long");<br />ValidationResults r = customerValidator.Validate(myCustomer);<br />if (!r.IsValid)<br />{<br /> throw new InvalidOperationException("Validation error found.");<br />}</p><p>Visual Basic<br />Dim factory As ValidatorFactory = EnterpriseLibraryContainer.Current.GetInstance(Of </p><p>ValidatorFactory)()<br />Dim customerValidator As Validator(Of Customer)<br />= factory.CreateValidator(Of Customer)()</p><p>Dim myCustomer As New Customer("A name that is too long")<br />Dim r As ValidationResults = customerValidator.Validate(myCustomer)<br />If Not r.IsValid Then<br /> Throw New InvalidOperationException("Validation error found.")<br />End If</p><p>
遺留的靜態態外觀( Facades )和工廠
為保持向前相容
初始化並設定當前容器
EnterpriseLibraryContainer類預設封裝一個Unity容器的執行個體,並通過Current屬性和IServiceLocator介面的
實現暴露對它的引用。調用 GetInstance 方法是容器真正的工作。你可以通過配置專門設定一個Unity容器。配置是負責從一個特定的源獲得配置資訊,並應用到容器中作為一系列類型的註冊和映射。下面的例子使用預設的Unity容器配置。
C#<br />var container = new UnityContainer();<br />var configurator = new UnityContainerConfigurator(container);<br />// Read the configuration files and set up the container.<br />EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create());</p><p>// The container is now ready to resolve Enterprise Library objects</p><p>Visual<br />Dim container = New UnityContainer()<br />Dim configurator = New UnityContainerConfigurator(container)<br />' Read the configuration files and set up the container.<br />EnterpriseLibraryContainer.ConfigureContainer(configurator, ConfigurationSourceFactory.Create())</p><p>' The container is now ready to resolve Enterprise Library objects<br />
如果你沒有在應用程式中是用依賴注入風格,或者如果您使用捷徑來初始化和填充的容器,你通常不用關心實
現細節。但是有些場合你想改變底層容器,比如:
1。你有一個應用程式為一些事情而使用依賴注入容器,但是仍有就的企業庫用戶端代碼在使用,你希望在不重寫
對靜態外觀調用的情況下整合所有的東西。
2。你的應用程式使用靜態外觀或者 EnterpriseLibraryContainer.Current.GetInstance 獲得企業庫對象並且你
希望使用一個源而不是應用程式的設定檔來改變最終配置。
改變容器相當容易。你所需要的就是實現 IServiceLocator 介面。 不過,如果你想從配置源載入配置資訊,
你會得益於使用IConfigurationSource執行個體和配置,以及IServiceLocator介面的實現。
一個實現了IConfigurationSource介面的對象包含企業庫的配置資訊。企業庫附帶的幾個實現能夠通過應用程
序設定檔、單獨的檔案、記憶體字典中讀取這些資訊。它將與配置一起來建立容器。
下面的代碼示範如何使用UnityContainerConfigurator配置來建立容器、配置容器、使用ServiceLocator封裝
容器。C# </p><p>IUnityContainer container = new UnityContainer();</p><p>UnityContainerConfigurator configurator = new UnityContainerConfigurator(container);</p><p>IConfigurationSource configSource = ReadConfigSource(); </p><p>EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource);</p><p>IServiceLocator locator = new UnityServiceLocator(container);</p><p>EnterpriseLibraryContainer.Current = locator;</p><p>Visual Basic</p><p>Dim container As IUnityContainer = New UnityContainer() </p><p>Dim configurator As UnityContainerConfigurator _<br /> = New UnityContainerConfigurator(container) </p><p>Dim configSource As IConfigurationSource = ReadConfigSource() </p><p>EnterpriseLibraryContainer.ConfigureContainer(configurator, configSource)</p><p>Dim locator As IServiceLocator = New UnityServiceLocator(container)</p><p>EnterpriseLibraryContainer.Current = locator</p><p>
如果您使用的是企業庫的預設容器實現(Unity),您可以使用下面的代碼實現相同的結果:
{
dp.sh.Toolbar.Command('ViewSource',this);return false;
}" href="http://blog.csdn.net/sfbirp/archive/2010/05/19/5606055.aspx#">view plain{
dp.sh.Toolbar.Command('CopyToClipboard',this);return false;
}" href="http://blog.csdn.net/sfbirp/archive/2010/05/19/5606055.aspx#">copy to clipboard{
dp.sh.Toolbar.Command('PrintSource',this);return false;
}" href="http://blog.csdn.net/sfbirp/archive/2010/05/19/5606055.aspx#">print{
dp.sh.Toolbar.Command('About',this);return false;
}" href="http://blog.csdn.net/sfbirp/archive/2010/05/19/5606055.aspx#">?
- C#
- EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(ReadConfigSource());
-
- Visual Basic
- EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(ReadConfigSource());
-
C#<br />EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(ReadConfigSource());</p><p>Visual Basic<br />EnterpriseLibraryContainer.Current = EnterpriseLibraryContainer.CreateDefaultContainer(ReadConfigSource());</p><p>