Unity 开发和配置
概述
Unity是一個輕量級的可擴展的依賴注入容器,支持構造函數,屬性和方法調用注入。Unity可以處理那些從事基于組件的軟件工程的開發人員所面對的問題。構建一個成功應用程序的關鍵是實現非常松散的耦合設計。松散耦合的應用程序更靈活,更易于維護。這樣的程序也更容易在開發期間進行測試。你可以模擬對象,具有較強的具體依賴關系的墊片(輕量級模擬實現),如數據庫連接,網絡連接,ERP連接,和豐富的用戶界面組件。例如,處理客戶信息的對象可能依賴于其他對象訪問的數據存儲,驗證信息,并檢查該用戶是否被授權執行更新。依賴注入技術,可確保客戶類正確實例化和填充所有這些對象,尤其是在依賴可能是抽象的 。
Unity 配置文件的完整格式
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration, Version=1.0.0.0,Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> </configSections><unity> <typeAliases><typeAlias alias="singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" /><typeAlias alias="external" type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" /><typeAlias alias="IMyInterface" type="MyApplication.MyTypes.MyInterface, MyApplication.MyTypes" /><typeAlias alias="MyRealObject" type="MyApplication.MyTypes.MyRealObject, MyApplication.MyTypes" /><typeAlias alias="IMyService" type="MyApplication.MyTypes.MyService, MyApplication.MyTypes" /><typeAlias alias="MyDataService" type="MyApplication.MyTypes.MyDataService, MyApplication.MyTypes" /><typeAlias alias="MyCustomLifetime" type="MyApplication.MyLifetimeManager, MyApplication.MyTypes" /> </typeAliases><containers><container name="containerOne"><types><type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass" /><type type="IMyInterface" mapTo="MyRealObject" name="MyMapping" /><type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass"><lifetime type="singleton" /> </type><type type="IMyInterface" mapTo="MyRealObject" name="RealObject"><lifetime type="external" /></type><type type="Custom.MyBaseClass" mapTo="Custom.MyConcreteClass"><lifetime value="sessionKey" type="MyApplication.MyTypes.MyLifetimeManager,MyApplication.MyTypes" /></type><type type="IMyInterface" mapTo="MyRealObject" name="CustomSession"><lifetime type="MyCustomLifetime" value="ReverseKey" typeConverter="MyApplication.MyTypes.MyTypeConverter,MyApplication.MyTypes" /></type><type type="IMyService" mapTo="MyDataService" name="DataService"><typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement, Microsoft.Practices.Unity.Configuration"><constructor><param name="connectionString" parameterType="string"><value value="AdventureWorks"/></param><param name="logger" parameterType="ILogger"><dependency /></param> (車延祿)</constructor> <property name="Logger" propertyType="ILogger" /><method name="Initialize"><param name="connectionString" parameterType="string"><value value="contoso"/></param><param name="dataService" parameterType="IMyService"><dependency /></param></method></typeConfig></type></types><instances><add name="MyInstance1" type="System.String" value="Some value" /><add name="MyInstance2" type="System.DateTime" value="2008-02-05T17:50:00" /></instances><extensions><add type="MyApp.MyExtensions.SpecialOne" /></extensions><extensionConfig><add name="MyExtensionConfigHandler" type="MyApp.MyExtensions.SpecialOne.ConfigHandler" /></extensionConfig></container> </containers> </unity> </configuration>?
?
unity的設計圖
?
?
?
Unity的配置節的名稱為”Unity",節處理程序的類型為 Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,它包含在程序集 Microsoft.Practices.Unity.Configuration 中。所在應當在網站是添加該程序集的引用。
unity 的子元素包含了一個 containers 元素,containers 元素可以包含若干個 container 元素。container 元素就是每個容器的配置,它有一個可選的 name 屬性,用于指定容器的名稱。
<types> 元素是 container 元素的子元素之一。包含任意數量的 type元素,用以添加類型注冊,這些配置被container.RegisterType<TFrom,TTo>()注冊;
type元素的屬性。
name:在注冊此類型時使用的名稱。此屬性是可選的,如果不指定此屬性,所在的 add 元素即為默認的類型映射。
type:容器中配置的源類型。如果這是映射注冊,這就是映射的起始對象的類型;如果這是單件注冊,這就是對象的類型。此屬性是必須的。
mapTo:類型映射的目標類型。如果這是映射注冊,這就是映射的目標對象的類型。此屬性是可選的。
lifetime:設置用于給定的類型和名稱的生命周期。是一個來自 LifetimeStyle 枚舉的值。有效的值是 Transient(默認),它導致了容器每次都創建一個新的實例;以及 Singleton,它使容器為每個請求返回同一實例。如果在配置一個單件時同時指定了 type 和 mapto 屬性,SetSingleton 方法將返回指定在 mapTo 屬性中的類型。如果 mapTo 屬性沒有指定值,SetSingleton 方法將返回指定在 type 屬性中的類型。
<instances> 元素保持了用于此容器的已有對象實例的列表。這些對象被用容器的 RegisterInstance 方法進行注冊。instances 元素包含了一系列添加單個實例的 add 元素。
add 元素的屬性。
name:注冊此實例時使用的名稱。此屬性是可選的。
type:此實例的類型。此屬性是可選的。如果忽略,假定的類型是 System.String。
value:用于初始化實例的值。此屬性是必須的。
typeConverter:用以轉換提供的值到實例的匹配類型的類型轉換器。如果沒有指定,將使用指定類型的默認轉換器。此屬性是可選的。
<typeConfig extensionType="Microsoft.Practices.Unity.Configuration.TypeInjectionElement,Microsoft.Practices.Unity.Configuration">
用來配置在類型注冊時,構造函數依賴注入,屬性依賴注入和方法依賴注入時的對象初始化信息。它包含以下幾個子元素:
?
?
?
在執行Container.Resolve()生成對象實例的時候,會根據上面的配置信息的內容對要生成的對象進行依賴注入。
二、加載配置信息到容器中
1、加載一個單獨的未命名容器或規定了默認容器:
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers.Default.Configure(container);
這樣就會根據配置文件中的配置信息,在UnityContainer容器中注冊類型映射
2、加載一個特殊命名容器的配置信息,需要使用定義在配置文件中的容器名,而不是引用默認容器。例如,如果在配置中有一個命名為containerOne的容器,能使用如下代碼初始化并加載它:
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].Configure(container);
3、為了從配置信息中創建一個嵌套容器繼承, 可以簡單的使用CreateChildContainer方法在你需要的繼承深度中創建容器對象,然后通過讀取各自的配置文件加載合適的配置。下面的代碼展示了如何從配置文件中實例化和加載兩個容器,這個配置文件同時包含了針對兩個命名為containerOne和newstedChildContainer容器的注冊信息,類型映射和擴展定義。
IUnityContainer parentContainer = new UnityContainer();
IUnityContainer childContainer = parentContainer.CreateChildContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].GetConfigCommand().Configure(parentContainer);
section.Containers["nestedChildContainer"].Configure(childContainer);
?
?
API
UnityContainer.RegisterType<ITFrom,TTO>();
UnityContainer.RegisterType< ITFrom, TTO >();
UnityContainer.RegisterType< ITFrom, TTO >("keyName");
IEnumerable<T> databases = UnityContainer.ResolveAll<T>();
IT instance = UnityContainer.Resolve<IT>();
T instance = UnityContainer.Resolve<T>("keyName");
UnitContainer.RegisterInstance<T>("keyName",new T());
UnityContainer.BuildUp(existingInstance);
IUnityContainer childContainer1 = parentContainer.CreateChildContainer();
示例
public abstract class SQLHelp{public abstract string SqlConnection();}public class MySqlHelp:SQLHelp{public override string SqlConnection(){return "my sql connection";}}public class MSSqlHelp : SQLHelp{public override string SqlConnection(){return "ms sql connection";}}public class OracleSqlHelp : SQLHelp{public override string SqlConnection(){return "oracle sql connection";}}?
?
?
app.config配置
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/></configSections><unity xmlns="http://schemas.microsoft.com/practices/2010/unity"><container><register type="SqlHelp, New_Code" mapTo="MySqlHelp, New_Code"><lifetime type="singleton"/></register></container></unity> </configuration>?
?
實現代碼
public void Main(){IUnityContainer container = new UnityContainer();UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");section.Containers.Default.Configure(container);SQLHelp sqlHelp = container.Resolve<SQLHelp>();Console.WriteLine(sqlHelp.SqlConnection());}?
?
運行結果:
my sql connection
?
歡迎各位參與討論,如果覺得對你有幫助,請點擊??? 推薦下,萬分謝謝.
作者:spring yang
出處:http://www.cnblogs.com/springyangwc/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
轉載于:https://www.cnblogs.com/springyangwc/archive/2012/05/17/2506595.html
總結
以上是生活随笔為你收集整理的Unity 开发和配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dns_probe_possible连不
- 下一篇: 3ds Max怎么打造飞奔的卡通汽车形象