原文地址:http://www.cnblogs.com/kyo-yo/archive/2010/11/01/Learning-EntLib-Tenth-Decoupling-Your-System-Using-The-Unity-PART2-Learn-To-Use-Unity-One.html
?
???? 在上一篇文章中,我簡單介紹Unity的一些背景知識、為什么要使用Unity和使用Unity有什么好處。今天將繼續學習Unity,主要是了解Unity的一些常見的使用方法。
本篇文章將主要介紹:
Unity中的UnityContainer基本使用介紹,包括UnityContainer類的常用方法介紹,并且通過幾個小例子來介紹具體的使用方法,這些例子都會以代碼及配置文件兩種方式來實現。
?
????? 從UnityContainer(Unity容器)這個類的名稱中我們就可以看出其是Unity最重要的類,UnityContainer就像Unity 的一個司令部,而一個個對象就像一名名士兵,每個士兵來去都需要通過UnityContainer來管理,其掌管了所有對象的依賴關系,所有對象的創建都 會通過這個Unity容器來創建,,同時也可以說是一個外交部,對于我們開發者,我們不需要關心內部是怎么實現的,我們只需要事先設置好對象之間的關系, 然后在需要的時候告訴UnityContainer我需要什么,UnityContainer就會將我們需要的直接發給我們。(這些比喻可能不正確,但是 是我能想到的最好的比喻了)
使用代碼實現對象關聯注冊:
首先來看一個簡單的例子:
view sourceprint?
| 01 | public interface IClass |
| 05 | public class MyClass : IClass |
| 12 | ????public void ShowInfo() |
| 14 | ????????Console.WriteLine("這個是我的班級"); |
view sourceprint?
| 1 | static void Main(string[] args) |
| 3 | ????IClass classInfo = new MyClass(); |
| 4 | ????classInfo.ShowInfo(); |
這個是最常見的接口及其實現類的使用方法,定義一個接口,然后再定義一個類來實現這個接口,然后在具體使用的過程中,可以通過new關鍵字來實例化 具體來實現接口,雖然沒有語法上的問題,但是這樣會造成緊耦合,如果一旦具體的實現類發生了改變,則就需要修改代碼,而且如果這種類似的代碼很多,則會導 致整個項目的變動,甚至出現異常,所以我們需要使用IOC來解耦,具體代碼如下:
view sourceprint?
| 01 | public static void ContainerCode() |
| 03 | ????IUnityContainer container = new UnityContainer(); |
| 04 | ????container.RegisterType<IClass, MyClass>(); |
| 05 | ????//另一種注冊方法,不過沒有RegisterType<>()方法來的方便 |
| 06 | ????//container.RegisterType(typeof(IClass), typeof(MyClass)); |
| 07 | ????IClass classInfo = container.Resolve<IClass>(); |
| 08 | ????//另一種通過container獲取具體對象的方法 |
| 09 | ????//IClass classInfo = container.Resolve(typeof(IClass)); |
| 10 | ????classInfo.ShowInfo(); |
使用Unity來管理對象與對象之間的關系可以分為以下幾步:
1、創建一個UnityContainer對象。
2、通過UnityContainer對象的RegisterType方法來注冊對象與對象之間的關系。
3、通過UnityContainer對象的Resolve方法來獲取指定對象關聯的對象。
?
使用配置文件來實現對象關系注冊:
以上是通過代碼的方式來注冊對象之間的關系,但是對于一個項目來說,正式部署后,由于代碼都編譯成DLL,如果要修改依賴關系則修改代碼并重新編譯,相對來說太麻煩了,所以Unity還提供配置文件配置的方式來配置對象之間的關系,配置如下:
view sourceprint?
| 01 | <?xml version="1.0" encoding="utf-8" ?> |
| 04 | ????<section name="unity" |
| 05 | ?????????????type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, |
| 06 | ?????????????Microsoft.Practices.Unity.Configuration"/> |
| 08 | ??<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> |
| 09 | ????<alias alias="IClass" type="UnityStudyConsole.IDemo.IClass, UnityStudyConsole" /> |
| 10 | ????<alias alias="MyClass" type="UnityStudyConsole.Demo.MyClass, UnityStudyConsole" /> |
| 13 | ??????<register type="IClass" name="ConfigClass" mapTo="MyClass" /> |
具體代碼調用如下:
view sourceprint?
| 01 | public static void ContainerConfiguration() |
| 03 | ????IUnityContainer container = new UnityContainer(); |
| 05 | ????UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); |
| 06 | ????//默認方法,默認獲取名稱為"unity"配置節下配置信息 |
| 07 | ????container.LoadConfiguration(); |
| 08 | ????//獲取已命名的配置節<container name="FirstClass">下的配置信息 |
| 09 | ????container.LoadConfiguration("FirstClass"); |
| 11 | ????container.LoadConfiguration(section); |
| 12 | ????//獲取特定配置節下已命名的配置節<container name="FirstClass">下的配置信息 |
| 13 | ????container.LoadConfiguration(section, "FirstClass"); |
| 15 | ????IClass classInfo = container.Resolve<IClass>("ConfigClass"); |
| 16 | ????classInfo.ShowInfo(); |
通過配置文件配置Unity信息需要有以下幾個步驟:
1、在配置文件中<configSections> 配置節下unity注冊。
2、在<configuration> 配置節下添加Unity配置信息。
3、在代碼中讀取配置信息,并將配置載入到UnityContainer中。
使用配置文件來配置對象信息雖然可以在部署的時候更改對象之間的依賴關系,但是當系統過于復雜,則就會導致配置文件的增大,所以我們需要將 Unity的配置信息從App.config或web.config中分離出來,但是這樣的話前面的代碼中調用方法就無效了,我們現在需要修改一下現有的 代碼:
view sourceprint?
| 01 | public static void ContainerConfigurationFromFile(string configFile) |
| 03 | ????//根據文件名獲取指定config文件 |
| 04 | ????var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile }; |
| 06 | ????Configuration configuration = |
| 07 | ????????ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); |
| 08 | ????var unitySection = (UnityConfigurationSection)configuration.GetSection("unity"); |
| 10 | ????var container = new UnityContainer() |
| 11 | ????????.LoadConfiguration(unitySection, "FirstClass"); |
| 13 | ????IClass classInfo = container.Resolve<IClass>("ConfigClass"); |
| 14 | ????classInfo.ShowInfo(); |
由于Unity配置相對來說比較復雜,一下子難以上手,而且不像企業庫的其他模塊可以通過配置工具進行配置,所以p&p小組為了方便通過配 置文件進行Unity配置,已經在企業庫5.0的安裝包中內置了UnityConfiguration20.xsd,你可以在X:\Program Files\Microsoft Visual Studio X.0\Xml\Schemas\下找到,這樣就可以在配置文件中進行Unity配置時出現只能提示了,如下圖:
需要注意的是,如果想出現這種提示,需要在新增的unity配置節中增加一個xmlns為http://schemas.microsoft.com/practices/2010/unity。(如果沒有安裝過EntLib5,所以沒有UnityConfiguration20.xsd,可以在下面的示例代碼中找到這個xsd。)
?
以上就是本文的所有內容了,主要是簡單介紹一下UnityContainer的基本使用方法——如何通過代碼及配置文件來實現對象之間關系,如有不對歡迎指出!
?
示例代碼下載:點我下載
?
微軟企業庫5.0 學習之路系列文章索引:
第一步、基本入門
第二步、使用VS2010+Data Access模塊建立多數據庫項目
第三步、為項目加上異常處理(采用自定義擴展方式記錄到數據庫中)
第四步、使用緩存提高網站的性能(EntLib Caching)
第五步、介紹EntLib.Validation模塊信息、驗證器的實現層級及內置的各種驗證器的使用方法——上篇
第五步、介紹EntLib.Validation模塊信息、驗證器的實現層級及內置的各種驗證器的使用方法——中篇
第五步、介紹EntLib.Validation模塊信息、驗證器的實現層級及內置的各種驗證器的使用方法——下篇
第六步、使用Validation模塊進行服務器端數據驗證
第七步、Cryptographer加密模塊簡單分析、自定義加密接口及使用—上篇
第七步、Cryptographer加密模塊簡單分析、自定義加密接口及使用—下篇
第八步、使用Configuration Setting模塊等多種方式分類管理企業庫配置信息
第九步、使用PolicyInjection模塊進行AOP—PART1——基本使用介紹
第九步、使用PolicyInjection模塊進行AOP—PART2——自定義Matching Rule
第九步、使用PolicyInjection模塊進行AOP—PART3——內置Call Handler介紹
第九步、使用PolicyInjection模塊進行AOP—PART4——建立自定義Call Handler實現用戶操作日志記錄
第十步、使用Unity解耦你的系統—PART1——為什么要使用Unity?
第十步、使用Unity解耦你的系統—PART2——了解Unity的使用方法(1)
擴展學習:
擴展學習篇、庫中的依賴關系注入(重構 Microsoft Enterprise Library)[轉]
?
轉載于:https://www.cnblogs.com/fcsh820/archive/2010/11/09/1872775.html
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的(转)[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)...的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。