[.NET][C#]動態載入指定的Class(依賴注入DI)

前陣子專案內需要抽換原本共用類別庫內的功能並引用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控制反轉回主程式的設計,兩篇都是採用組態檔介面的方式注入,可以增加類別庫在不同客戶需求應用上的彈性,筆記下來。

 

 

參考:

Dynamically loading classes

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