Rafy是什麼可以通過下麵博客來瞭解 Rafy 領域實體框架演示(3) - 快速使用 C/S 架構部署 - BloodyAngel - 博客園 以下是看源碼中的一點記錄,供以後學習使用 主要是Rafy中IOC容器的定義,實現方式,用法 下麵先看一個圖: 這個圖片包含,三個方面的內容 下麵主要從IOb ...
Rafy是什麼可以通過下麵博客來瞭解
Rafy 領域實體框架演示(3) - 快速使用 C/S 架構部署 - BloodyAngel - 博客園
以下是看源碼中的一點記錄,供以後學習使用
主要是Rafy中IOC容器的定義,實現方式,用法
下麵先看一個圖:
這個圖片包含,三個方面的內容
- 以Composer為核心的組件組合器,實現組件間通信。
- 以IEventBus為核心的事件匯流排發佈訂閱機制。
- 以IObjectContainer為核心的IOC容器。
下麵主要從IObjectContainer 介面開始
該介面,主要提供兩大方面的功能
- 註冊。
- 獲取。
詳細介面如下:
/// <summary>
/// 如果某個服務有多個實例,則可以使用此方法來獲取所有的實例。
/// </summary>
IEnumerable<object> ResolveAll(Type type);
/// <summary>
/// 如果某個服務有多個實例,則可以通過一個鍵去獲取對應的服務實例。
/// </summary>
object Resolve(Type type, string key = null);
/// <summary>
/// 註冊唯一實例
/// </summary>
/// <param name="key">如果有必須,則傳入實例的鍵。</param>
void RegisterInstance(Type type, object instance, string key = null);
/// <summary>
/// 註冊唯一實例
/// </summary>
/// <param name="instanceType">唯一實例的類型,該類型的實例會在第一次使用時被創建。</param>
/// <param name="key">如果有必須,則傳入實例的鍵。</param>
void RegisterInstance(Type type, Type instanceType, string key = null);
/// <summary>
/// 註冊類型
/// </summary>
/// <param name="key">如果有必須,則傳入實例的鍵。否則傳入 null。</param>
void RegisterType(Type from, Type to, string key = null);
Rafy內部預設實現了一種IOC容器介面:
通過適配器模式,將IObjectContainer 適配到 IServiceContainer。
通過適配器模式將IUnityContainer適配到IObjectContainer
什麼是UnityIOC 可以通過 深入理解IOC模式及Unity框架 - GavinJun - 博客園
來學習瞭解。
如果需要使用此種IOC則需要在Rafy環境啟動,插件初始化的時候,將原有的IOC替換成UnnityIoc 替換方式如下:
這是怎麼做到通過設置不同IOC工廠就可以替換IOC容器的呢?
ObjectContainerFactory.SetProvider(new UnityContainerAdapterFactory());
主要是上面這條語句,將Rafy 預設實現的 SimpleObjectContainer替換成了
UnityContainerAdapter
這樣整個Rafy的IOC容器管理都有UnityContainerAdapter來接管了
首先我們看看ObjectContainerFactory裡面是怎麼控制的
這個裡面比較簡單
- 一個工廠介面的私有變數,來存儲具體的容器工廠。
- 一個CreateContainer方法創建獨立的容器
- 一個SetProvider方法,這個方法是什麼鬼,好像沒有它,我們就沒法替換自己需要的IOC容器了,來具體看一下:
原來它只是把預設的工廠給替換掉了。
那如果我們也想用自己的工廠,替換自己的IOC容器,知道該怎麼做了沒有呢
首先
- 我們要實現 IObjectContainerFactory 這個工廠介面。
- 然後在合適的時機,調用SetProvider這個方法,這樣就可以實現容器替換了。