引入Wukong讓你的系統瞬間具備IOC能力

【Github源碼】本文重點要說的是如何通過引入Wukong第三方包讓自己的系統能夠擁有IOC容器能力,但在具體講解步驟之前 , 還是想先簡單的介紹一下什么是IOC以及它存在的意義;同時也就能清楚Wukong能為大家解決哪些問題 。
一、IOC的用途和意義??IOC是Inversion of Control的縮寫 , 多數書籍翻譯成“控制反轉”;也有的地方叫做“依賴注入(Dependency Injection)” 。?作者的理解IOC是一種基于工廠模式的更高級的對象獲取模式;使用該方法,可以將通過new方法創建對象實例的傳統方式;替換為通過IOC容器獲取對象實例 。通過使用IOC容器消除了對象之間的依賴強耦合,實現了對象之間的解耦 , 使得系統更靈活、更易擴展和維護 。
1. 傳統的對象獲取方式

引入Wukong讓你的系統瞬間具備IOC能力

文章插圖
傳統方式必須在項目中顯示引入對象所在程序集,同時在需要對象的位置進行顯示創建 。
Person p = new Person();p.SetName("張三");2. IOC容器獲取對象方式
引入Wukong讓你的系統瞬間具備IOC能力

文章插圖
?而IOC方式,項目只需要顯示引入Wukong依賴包,其他需要的對象通過IOC容器進行獲??;IOC和各個對象之間完全是弱引用,只會在IOC獲取真實對象實例時,才會去相應位置搜索對象定義并創建實例 。
dynamic p = Wukong.GetObject("CodeM.Test.Person");p.SetName("張三");二、如何引入Wukong依賴1. Package ManagerInstall-Package Wukong -Version 2.0.52. .NET CLIdotnet add package Wukong --version 2.0.53. PackageReference<PackageReference Include="Wukong" Version="2.0.5" />4. Paket CLIpaket add Wukong --version 2.0.5三、如何通過Wukong獲取對象實例Wukong提供了兩種獲取對象的方式,一種是通過類全名稱,二是通過配置方式獲取 。
1. 通過類全名稱獲取對象實例?Wukong提供了GetObject、GetObject、GetSingleObject、GetSingleObject四個方法,用于支持泛型、單例 。
2. 通過配置方式獲取對象實例?通過配置方式更加靈活 , 系統擴展和維護無需重新編譯;同時能夠在配置時,為對象屬性進行賦值和初始化操作;并且支持配置對象間的依賴引用 。
dynamic person = Wukong.GetObjectById("person");?同樣,Wukong也為通過配置方式獲取對象實例提供了GetObjectById、GetObjectById、GetSingleObjectById、GetSingleObjectById四個不同的方法,使用時可根據不同場景自由選擇 。
四、對象配置文件定義?對象配置文件采用XML格式,支持對象構造方法定義、屬性賦值定義;構造參數和屬性值類型支持字符串、數值、布爾、日期時間等常用簡單類型 , 以及枚舉 、列表、數組、對象引用等復雜類型 。
<?xml version="1.0" encoding="utf-8" ?><objects> <object id="father" class="TestExample.Person"><constructor-arg>"張三"</constructor-arg><constructor-arg type="TestExample.Sex">Male</constructor-arg> </object> <object id="mother" class="TestExample.Person"><constructor-arg>"李四"</constructor-arg><constructor-arg type="TestExample.Sex">Female</constructor-arg> </object> <object id="intParents" class="TestExample.Person"><constructor-arg ref="father"></constructor-arg><constructor-arg ref="mother"></constructor-arg> </object></objects>更多詳細對象配置文件的規則請查看完整Github說明文檔
五、通過Wukong獲取對象是如何找到對象所在程序集的?前面講到傳統方式使得對象之間依賴性太強,耦合嚴重;造成這個問題的原因有兩個:一是在每個使用對象的位置都需要通過new方法創建實例;二是所有使用到的對象都必須在項目中引用對象所在的包 。
?那么當我們指定了類的全名稱之后,Wukong是如何通過類全名稱找到相應的類定義信息并創建實例的呢?Wukong有兩種方法實現上述目的:一是像傳統方法一樣將對象所在的第三方包進行顯示引用 , 但這種方式會導致引用之間的強耦合性;同時對于系統的擴展性不是很友好;因此并不推薦;第二種方式是將第三方包程序集文件放到系統運行目錄或其他指定目錄即可,該種方式靈活已擴展,且方便系統運行中的熱更新 , 推薦使用該方法 。
?當使用第二種方法時,如果將第三方包程序集文件放在系統運行目錄中 , 不需要做額外工作,即可通過Wukong正常獲取到其中的對象實例;假如因為某種原因需要將程序集文件放到其他指定目錄中 , 此時需要使用Wukong提供的方法AddSearchPath將目錄添加到搜索范圍內,Wukong才能夠正常獲取到對象實例 。

推薦閱讀