前陣子專案內需要抽換原本共用類別庫內的功能並引用third party的dll,但不希望改動原本主程式的程式碼,上一篇介紹了動態繫結,這一篇介紹下集:
- 動態繫結
- 依賴注入DI(Unity framework)
類別庫與主程式的低耦合時可以選用的做法。
B.依賴注入Dependency Injection (採Unity framework)
首先還是要有相同的入口介面ICache,兩個類別RuntimeMemory.cs及AppFabricCache.cs,可以參考上篇步驟1.2 完成類別庫的建立。接下來:
1.主程式專案從Nuget下載並安裝Unity FrameWork
參考會多出4組Microsoft.Practices
2.組態Config檔案增加以下設定
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<container>
<register type="類別庫namespace.ICache,類別庫namespace" mapTo="類別庫namespace.RuntimeMemoryCache,類別庫namespace" name="CacheClass" />
<register type="類別庫namespace.ICache,類別庫namespace" mapTo="類別庫namespace.AppFabricCache,類別庫namespace" name="Off" />
</container>
</unity>
3.主程式與上一篇相同,建立類別庫中的介面ICache,但這邊使用Unity Container:
UnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(container);
ICache oCache = container.Resolve<ICache>("CacheClass");
oCache.Add("CacheId", "cache content");
透過組態檔Container內註冊Type及程式內CacheClass name,執行階段時就可以動態解析對應的Class。
- 客戶若有獨立的cache server,使用AppfabricCache
- 客戶若沒有,使用runtimeCache
算是初步完成loC控制反轉回主程式的設計,兩篇都是採用組態檔介面的方式注入,可以增加類別庫在不同客戶需求應用上的彈性,筆記下來。
參考:
Unity Framework: How to Instantiate two classes from the same Interface?
Reflection and Dynamic Class Loading
Resolving Instances of Types Using Unity
Unity IoC container: tips, tricks and dirty hacks