亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

微軟企業(yè)庫4.1學習筆記(二十五)Unity依賴注入

系統(tǒng) 2048 0

  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的配置格式。

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < configuration > ?
  < configSections > ?
    < section? name ="unity" ?type ="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,?Microsoft.Practices.Unity.Configuration" ? />
  ? </ configSections > ?
  < unity > ?...?...?
  </ unity > ?...?...?
</ configuration >

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

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> <? xml?version="1.0"?encoding="utf-8"? ?> ?
< configuration > ?
  < configSections > ?
    < section? name ="unity" ?type ="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft?patterns?&?practices?–?Unity?Application?Block?1.2?–?October?2008?27
Microsoft.Practices.Unity.Configuration,?=1.2.0.0,?Culture=neutral,?PublicKeyToken=31bf3856ad364e35"
? /> ?
  </ configSections >
  ? < unity > ?
    < typeAliases > ? <!-- ?Lifetime?manager?types? --> ?
      < typeAlias? alias ="singleton" ?type ="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,?Microsoft.Practices.Unity" ? /> ?
      < typeAlias? alias ="perThread" ?type ="Microsoft.Practices.Unity.PerThreadLifetimeManager,?Microsoft.Practices.Unity" ? />
      ? < typeAlias? alias ="external" ?type ="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,?Microsoft.Practices.Unity" ? /> ? <!-- ?User-defined?type?aliases? --> ?
      < 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?mapping?with?no?lifetime?–?defaults?to?"transient"? --> ?
          < type? type ="Custom.MyBaseClass" ?mapTo ="Custom.MyConcreteClass" ? /> ? <!-- ?Type?mapping?using?aliases?defined?above? --> ?
          < type? type ="IMyInterface" ?mapTo ="MyRealObject" ?name ="MyMapping" ? /> ? <!-- ?Lifetime?managers?specified?using?the?type?aliases? --> ?
          < type? type ="Custom.MyBaseClass" ?mapTo ="Custom.MyConcreteClass" > ? < lifetime? type ="singleton" ? /> ? </ type >
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 >
    ? </ container > ? <!-- ?...?more?containers?here?...? --> ? </ containers > ?
  </ unity > ?
</ configuration >

?

  將配置信息加載到容器中

  Unity不會自動讀取配置信息來創(chuàng)建和準備好一個容器。你需要在應用中用代碼來初始化容器,你也可以用代碼注冊類型,類型映射,任何從文件中讀取的擴展信息都可以用代碼來創(chuàng)建。

  如果配置定義了一個未命名的容器,這個沒有名字的容器就是默認的容器。你也可以給容器命名。你可以將每一個容器的配置信息加載到容器中,

  下面的代碼就是初始化一個新的容器,然后加載配置文件中配置的類型,映射,和擴展定義。

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> IUnityContainer?container? = ? new ?UnityContainer();?
UnityConfigurationSection?section? = ?(UnityConfigurationSection)ConfigurationManager.GetSection( " unity " );?
section.Containers.Default.Configure(container);

?

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

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> IUnityContainer?container? = ? new ?UnityContainer();
?UnityConfigurationSection?section? = ?(UnityConfigurationSection)ConfigurationManager.GetSection( " unity " );?
section.Containers[ " containerOne " ].Configure(container);

?

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

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> 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);

?

?

  你不能在配置文件中嵌套容器,在containers節(jié)中的所有container元素都是同一個級別的元素。容器嵌套是通過代碼來創(chuàng)建,并且加載適當?shù)娜萜鳌?

  使用可替代的配置源

  如果有需要的話,你可以使用任何xml文件或者是其他源作為配置信息。例如,你可以用System.Configuration.Configuration類獲取任何xml文件的配置信息,下面的代碼中就是這樣用的。

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> ExeConfigurationFileMap?map? = ? new ?ExeConfigurationFileMap();
?map.ExeConfigFilename? = ? " MyConfig.config " ;?
System.Configuration.Configuration?config? = ?ConfigurationManager.OpenMappedExeConfiguration(map,?ConfigurationUserLevel.None);
?UnityConfigurationSection?section? = ?(UnityConfigurationSection)config.GetSection( " unity " );
?IUnityContainer?container? = ? new ?UnityContainer();
?section.Containers[ " myContainer " ].Configure(container);

?

  配置支持數(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子元素描述了獲取指定類型的實例

?

代碼
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> < typeAliases > ?
  < typeAlias? alias ="ILogger" ?type ="Microsoft.Practices.Unity.TestSupport.ILogger,?TestSupport.Unity" ?/?<typeAliases > ?
    < container? name ="populatedArrayWithValues" >
      ? < types >
        ? < type? type ="ILogger" ?mapTo ="MockLogger" ?name ="logger1" > ? < lifetime? type ="singleton" ? /> ? </ type > ?
         < type? type ="ILogger" ?mapTo ="SpecialLogger" ?name ="logger2" > ? < lifetime? type ="singleton" ? /> ? </ type >
< type? type ="ArrayConstructor" > ?
          < typeConfig > ?
            < constructor > ?
              < param? name ="loggers" ?parameterType ="ILoggerArray" > ? < array > ? < dependency? name ="logger2" /> ? < dependency? name ="logger1" /> ? </ array > ? </ param > ? </ constructor > ? </ typeConfig > ? </ type > ?
  </ types > ?
</ container >

?

未完待續(xù)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

微軟企業(yè)庫4.1學習筆記(二十五)Unity依賴注入模塊2


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩顶级毛片www免费看 | 爱操在线| 日本高清中文字幕一区二区三区 | 国产成人爱片免费观看视频 | 亚洲欧美日韩国产一区图片 | 狠狠操天天操视频 | 九月婷婷天天澡天天添天天爽 | freexxxx性大陆另类 | 最新精品亚洲成a人在线观看 | 免费黄片毛片 | 在线国产欧美 | 99热资源 | 亚洲综合网在线 | 九九在线偷拍视频在线播放 | 特级一级毛片视频免费观看 | 久久精品国产色蜜蜜麻豆 | 国产精品视频全国免费观看 | 欧美成人久久一级c片免费 欧美成人剧情中文字幕 | 久久狠狠色狠狠色综合 | 日本在线亚州精品视频在线 | 久久精品福利视频 | 香蕉视频禁止18 | a一级毛片视频免费看 | 成人国产精品一区二区网站 | 亚洲精品不卡 | 色综合夜夜嗨亚洲一二区 | 美女一级毛片免费不卡视频 | 97视频免费在线观看 | 99久久精品99999久久 | 在线欧洲成人免费视频 | 欧美影院一区二区三区 | 夜夜躁日日躁狠狠久久 | 97夜夜操 | 国产激情小视频 | 九九国产精品 | 第一区免费在线观看 | 欧美成人毛片在线视频 | www国产永久免费视频看看 | 精品久久久久久久高清 | 国产成人h片视频在线观看 国产成人h综合亚洲欧美在线 | 手机福利片 |