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

高效

在實現手段上,My.Ioc 通過使用泛型、快取、動態生成程式碼、延遲註冊、儘量使用抽象類而非介面等方式來提高框架的效能。如果您想進一步瞭解通過上面這些手段,我們能夠獲得怎樣的效能,請看這篇文章

便於擴充套件

在設計時,可擴充套件性是作者始終關注的問題之一。My.Ioc 也確實提供了良好的可擴充套件性。您可以通過以下方式實現擴充套件:

1. 自定義 Lifetime 實現。

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

3. 通過新增自定義 IConstructorInjectionConfigurationItem/IMemberInjectionConfigurationItem 以及修改現有 IInjectionConfigurationInterpreter 的方式增加或修改物件建立邏輯(參見這篇文章)。例如,要想給某個現有註冊項增加 Decorator,可以通過增加一個 IConstructorInjectionConfigurationItem 的方式來實現。

配置簡單

使用程式碼方式進行註冊,而不必編寫一大堆配置檔案那麼繁瑣。當然,配置方式是可以擴充套件的,而且也很容易擴充套件。如果您喜歡,您也可以自行實現一個通過配置檔案進行註冊的機制。

功能全面

  • 支援建構函式、屬性和方法注入(參見這篇文章這篇文章)。
  • 採用 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),以保證框架的零侵入性。