?
繼前篇,在Orchard Application_Start() -> HostInitialization() 里,調用 OrchardStarter.CreateHost創建IOrchardHost實例。
1: /// <summary>
2: /// OrchardHost Initialization. OrchardHost 初始化。
3: /// </summary>
4: private static IOrchardHost HostInitialization(HttpApplication application)
5: {
6: // 注冊三個 MVC原生類型為單例模式:RouteTable.Routes、ModelBinders.Binders、ViewEngines.Engines。
7: var host = OrchardStarter.CreateHost(MvcSingletons);
8:
9: host.Initialize();
10:
11: // initialize shells to speed up the first dynamic query
12: // 初始化一個 shell。
13: host.BeginRequest();
14: host.EndRequest();
15:
16: return host;
17: }
1: /// <summary>
2: /// 創建 OrchardHost。 CreateHostContainer -> HostContainer.Resolve(IOrchardHost)。
3: /// </summary>
4: /// <param name="registrations">在Global中定義,注冊三個 MVC原生類型為單例模式:RouteTable.Routes、ModelBinders.Binders、ViewEngines.Engines。</param>
5: /// <returns></returns>
6: public static IOrchardHost CreateHost(Action<ContainerBuilder> registrations)
7: {
8: var container = CreateHostContainer(registrations);
9: return container.Resolve<IOrchardHost>();
10: }
在創建HOST之初,就構建了HostContainer,這是一個靜態方法,用于構造Host解析容器,并使用Autofac為系統進行IOC注冊。
CreateHostContainer代碼省略。
通過總結我們知道Autofac 幾種常用的類型注冊方式如下:
一、類型注冊
直接按照類型及其接口定義進行注冊
二、實例注冊
使用類型實例進行注冊
三、命名注冊
使用類型及其接口定義進行注冊,使用 .Named擴展進行約束
四、鍵值注冊
使用類型及其接口定義進行注冊,使用 . Keyed擴展進行約束
在CreateHostContainer方法里,除了上述形式外,還使用了:
五、模塊注冊
模塊注冊,是為抽象類 Autofac.Module定義的一個實現。其主要的方法有
u Load 在IOC注冊調用RegisterModule時發生,可以在Load中進行類型注冊,就像前四種注冊方式一樣進行。
u Configure 在RegisterModule調用后,將Load方法里的內容加載到Autofac注冊表里時發生。
通過測試發現,在IOC注冊時,前四種注冊方式,所注冊的類型默認按類型(Type)、命名(Named)、鍵值(Keyed)進行了分組,在被解析的類型構造參數中,可以使用參數構造定義的約束來使用不同的注冊類型。并且Autofac 對同一個“接口類型”注冊進來的不同“實現類型”,會自動形成一個 IEnumerable-List(即 可枚舉的集合)。
DEMO代碼
相關參考
http://www.cnblogs.com/hkncd/archive/2012/11/28/2792474.html