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),以保證框架的零侵入性。
