國人編寫的開源 .net Ioc 框架——My.Ioc 簡介

My.Ioc 是做者開發的一款開源 IoC/DI 框架,下載地址在此處。它具備下面一些特色:html

高效緩存

在實現手段上,My.Ioc 經過使用泛型、緩存、動態生成代碼、延遲註冊、儘可能使用抽象類而非接口等方式來提升框架的性能。若是您想進一步瞭解經過上面這些手段,咱們可以得到怎樣的性能,請看這篇文章安全

便於擴展多線程

在設計時,可擴展性是做者始終關注的問題之一。My.Ioc 也確實提供了良好的可擴展性。您能夠經過如下方式實現擴展:app

1. 自定義 Lifetime 實現。框架

2. 註冊自定義 ObjectBuilderRequested 事件 Handler 以實現延遲註冊(參見這篇文章)。函數

3. 經過添加自定義 IConstructorInjectionConfigurationItem/IMemberInjectionConfigurationItem 以及修改現有 IInjectionConfigurationInterpreter 的方式增長或修改對象建立邏輯(參見這篇文章)。例如,要想給某個現有註冊項增長 Decorator,能夠經過增長一個 IConstructorInjectionConfigurationItem 的方式來實現。性能

配置簡單ui

使用代碼方式進行註冊,而沒必要編寫一大堆配置文件那麼繁瑣。固然,配置方式是能夠擴展的,並且也很容易擴展。若是您喜歡,您也能夠自行實現一個經過配置文件進行註冊的機制。spa

功能全面

  • 支持構造函數、屬性和方法注入(參見這篇文章這篇文章)。
  • 採用 Fluent Api 方式進行配置。
  • 自動註冊/解析未註冊的類型(必須是具體類型,而不能是接口、抽象類或值類型。參見這篇文章)。
  • 支持 Open Generic 類型註冊。
  • 支持延遲註冊(參見這篇文章
  • 良好的可擴展性(參見這篇文章)。
  • 默認提供 Container/Scope/Transient 三種 Lifetime,但容許自定義 Lifetime。
  • 支持元數據(參見這篇文章
  • 支持條件綁定(或稱上下文綁定。例如,若是有多個類(使用者)都須要依賴於 IMyService 服務,那麼使用者在註冊不一樣 IMyService 實現時,能夠指定只有知足某些條件的使用者才能使用該實現。參見這篇文章)。
  • 支持依賴對象映射(例如,某個類的構造函數須要依賴於一個 IEnumerable<IMyService> 對象,而 IEnumerable<IMyService> 未註冊,但容器中註冊了 IMyService 的一個或多個實現,此時可經過對象映射器 [ObjectMapper] 將這些實現組裝成一個 IEnumerable<IMyService> 對象以知足構造須要)。
  • 支持註銷對象(參見這篇文章)。
  • 提供 IObjectObserver/IObjectCollectionObserver 機制,能夠在所依賴的對象註冊/註銷/激活/停用時收到事件通知,從而更好地響應變化(參見這篇文章)。
  • 支持 .net 2.0。

面向服務考慮

在面向服務環境中,服務常常處於變化之中。一個服務可能在這一時刻可用,但下一時刻已不可用。爲此,框架提供了註銷 (Unregister) 功能和觀察者 (IObjectObserver/IObjectCollectionObserver) 機制來適應這種變化。使用者能夠在運行過程當中隨時註銷某個服務實現(前提是該實現由該使用者註冊,並且該使用者在註冊服務時保留了該服務的 IObjectRegistration 對象)或註冊新的服務實現以替代已被註銷/過時 (Obsolete) 的服務實現,而其餘依賴於該服務的上層服務將會隨着該服務的註銷/註冊而自動停用/激活,相關的觀察者則會向自身的 Changed 事件訂閱者發送服務激活 (Activated)/停用 (Deactivated) 的通知。

富於交互性

框架提供了 ObjectBuilderRegistered/ObjectBuilderUnregistering/ObjectBuilderRequested 事件、IObjectObserver/IObjectCollectionObserver 的通知事件、ILifetimeScope 的 LifetimeScopeEnded 事件(可用於在資源釋放後執行自定義操做)、IObjectRegistration 的 Changed 事件等各種事件,使用者能夠根據須要訂閱它們,以實現與框架的交互。

安全性

安全性是做者在設計時的重要考量之一。框架具有線程安全性,可用於多線程環境中。此外,框架經過 ILifetimeScope 來管理資源的釋放 (Dispose)。使用者在解析(獲取)對象/服務時,必須指定相應的 ILifetimeScope,並在使用完成後正確釋放 ILifetimeScope,從而確保資源安全性。最後,框架遵循最小可訪問性原則(儘可能使用 private、protected、internal,少用 public),以保證良好的封裝和可見性控制,從而防止 Api 濫用或誤用。

零侵

同安全性同樣,侵入性也是做者在設計時的考量之一。所以,咱們摒棄了其餘一些 Ioc 框架(例如 NInject/Unity)所採用的經過 Attribute 標註實現某些功能的方式(例如標註某個要注入的構造函數/屬性/方法等),轉而要求使用者在註冊時提供具體信息(例如在配置方法注入時,只需提供方法名稱便可。但若是該方法含有多個重載,則需提供具體的 MethodInfo),以保證框架的零侵入性。

相關文章
相關標籤/搜索