Unity模塊的亮點
Unity模塊包括了下面的特點
- 提供了一個創(chuàng)建對象,以及依賴的對象的方法
- 提供的RegisterType方法用來在容器中注冊類型和映射,Resolve方法可以返回任何依賴對象的實例。
- 提供控制反轉IOC功能,通過預先配置注入類的對象來實現(xiàn)。你可以在構造函數(shù)中指明一個類或者接口(構造函數(shù)注入),或者是使用attribute的屬性注入,和方法調用注入。
- 支持容器繼承,容器可以有子容器,支持對象從子容器傳遞到父容器中。
- 可以從標準的配置文件中讀取信息,例如xml文件
- 對類的定義沒有任何要求。在類上不需要添加attribute(除非使用屬性注入或者是方法調用注入),在類聲明中沒有任何限制。
- 支持自定義容器,例如,你可以在方法中實現(xiàn)額外的對象構造,和容器功能,例如容器的緩存功能。
什么時候使用Unity模塊
依賴注入提供了簡化代碼的機會,抽象對象之間的依賴,自動產(chǎn)生依賴對象的實例。但是,處理的過程對性能上有一點小的損失,而且可能會使得只需要簡單依賴的地方變得復雜。
通常來說,在下列情況你應該使用Unity模塊:
- 對象和類與其他對象和類有依賴關系。
- 你的依賴關系是復雜的,或者是需要抽象。
- 你需要構造函數(shù)、方法、或者是屬性注入的功能。
- 你需要管理對象實例的生命周期。
- 你需要在運行的時候可以配置和改變依賴關系。
- 你需要在web應用中緩存或者是持久化依賴關系。
在下面的情況,你不應該使用Unity模塊
- 你的對象和類與其他的對象和類沒有依賴關系。
- 你的依賴關系很簡單,不需要抽象。
在開發(fā)的過程中使用Unity模塊
這個主題描述如何在應用開發(fā)中使用Unity模塊。如何創(chuàng)建對象實例。
使用Unity模塊的系統(tǒng)需要
最小需要如下:
- Microsoft Windows XP Professional,Windows Server 2003,Windows Server 2008 or Windows Vista operating System。
- Microsoft .NET Framework 2.0,3.0 or 3.5。
- Microsoft Visual Studio 2005 or 2008 development system。
配置Unity模塊
Unity模塊可以從xml配置文件中讀取配置信息。默認情況下,就是應用中的app.config或者是web.config文件。你也可以從其他xml文件,或者是其他來源加載配置信息。
在運行的時候配置容器
1.格式化Unity配置文件
下面的xml格式就是Unity的配置格式。
?

? 下面是一個比較完整的配置文件
?

Microsoft?patterns?&?practices?–?Unity?Application?Block?1.2?–?October?2008?27
Microsoft.Practices.Unity.Configuration,?=1.2.0.0,?Culture=neutral,?PublicKeyToken=31bf3856ad364e35" ? /> ?
28?Microsoft?patterns?&?practices?–?Unity?Application?Block?1.2?–?October?2008
< type? type ="IMyInterface" ?mapTo ="MyRealObject" ?name ="RealObject" > ? < lifetime? type ="perThread" ? /> ? </ type > ? < type? type ="IMyInterface" ?mapTo ="MyRealObject" ?name ="RealObject" > ? < lifetime? type ="external" ? /> ? </ type > ? <!-- ?Lifetime?manager?specified?using?the?full?type?name? --> ? <!-- ?Any?initialization?data?specified?for?the?lifetime?manager? --> ? <!-- ?will?be?converted?using?the?default?type?converter? --> ? < type? type ="Custom.MyBaseClass" ?mapTo ="Custom.MyConcreteClass" > ? < lifetime? value ="sessionKey" ?type ="MyApplication.MyTypes.MyLifetimeManager,?MyApplication.MyTypes" ? /> ? </ type > ? <!-- ?Lifetime?manager?initialization?using?a?custom?TypeConverter? --> ? < type? type ="IMyInterface" ?mapTo ="MyRealObject" ?name ="CustomSession" > ? < lifetime? type ="MyCustomLifetime" ?value ="ReverseKey" ?typeConverter ="MyApplication.MyTypes.MyTypeConverter,?MyApplication.MyTypes" ? /> ? </ type > ? <!-- ?Object?with?injection?parameters?defined?in?configuration? --> ? <!-- ?Type?mapping?using?aliases?defined?above? --> ? < 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 >
Microsoft?patterns?&?practices?–?Unity?Application?Block?1.2?–?October?2008?29
</ 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 >
?
將配置信息加載到容器中
Unity不會自動讀取配置信息來創(chuàng)建和準備好一個容器。你需要在應用中用代碼來初始化容器,你也可以用代碼注冊類型,類型映射,任何從文件中讀取的擴展信息都可以用代碼來創(chuàng)建。
如果配置定義了一個未命名的容器,這個沒有名字的容器就是默認的容器。你也可以給容器命名。你可以將每一個容器的配置信息加載到容器中,
下面的代碼就是初始化一個新的容器,然后加載配置文件中配置的類型,映射,和擴展定義。
?

?
加載容器的時候,你也可以使用容器的名稱進行加載。下面的代碼就是加載了一個名為containerOne的容器。
?

?
創(chuàng)建一個在配置文件中定義的有繼承關系嵌套的容器,你可以用CreateChildContainer方法加載每一個適當?shù)娜萜餍畔ⅰ?
?

UnityConfigurationSection?section? = ?(UnityConfigurationSection)ConfigurationManager.GetSection( " unity " );?
?
?
你不能在配置文件中嵌套容器,在containers節(jié)中的所有container元素都是同一個級別的元素。容器嵌套是通過代碼來創(chuàng)建,并且加載適當?shù)娜萜鳌?
使用可替代的配置源
如果有需要的話,你可以使用任何xml文件或者是其他源作為配置信息。例如,你可以用System.Configuration.Configuration類獲取任何xml文件的配置信息,下面的代碼中就是這樣用的。
?

?
配置支持數(shù)組
Unity支持設計時數(shù)組參數(shù),和運行是數(shù)組參數(shù)。
在設計的時候配置支持數(shù)組參數(shù)
在配置文件中使用array元素作為list的代表。array元素描述了一個包含注冊實例和類型映射的數(shù)組。array可以嵌套使用,包含下面三個子元素:
- array
- dependency
-
value
代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < typeAlias? alias ="ILoggerArray" ?type ="Microsoft.Practices.Unity.TestSupport.ILogger[],?TestSupport.Unity" ? /> ? -
< typeAlias? alias ="ArrayConstructor" ?type ="Microsoft.Practices.Unity.TestSupport.ObjectArrayConstructorDependency,?Tests.Unity.Configuration" ? /> ? </ typeAliases > ?
-
< containers > ? < container? name ="emptyArray" > ? < types > ? < type? type ="ArrayConstructor" > ? < typeConfig? > ? < constructor > ? < param? name ="loggers" ?parameterType ="ILoggerArray" > ? < array? /> ? </ param > ? </ constructor > ? </ typeConfig > ? </ type >
Microsoft?patterns?&?practices?–?Unity?Application?Block?1.2?–?October?2008?33
</ types > ? </ container >?
?
下面的配置文件使用dependency子元素描述了獲取指定類型的實例
?

?
未完待續(xù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
