文章目錄:《從入門到放棄,.net構建博客系統》html
上一篇中有講到項目啓動時會進行ioc的依賴注入,但具體是怎麼注入的呢?咱們先一步步往下走git
1、註冊autofac配置github
首先bootstraper會進行初始化,接着將當前mvc控制器工廠改成AutofacControllerFactory。web
1 public class AutofacConfig 2 { 3 /// <summary> 4 /// 負責調用autofac框架實現業務邏輯層和數據倉儲層程序集中的類型對象的建立 5 /// 負責建立MVC控制器類的對象(調用控制器中的有參構造函數),接管DefaultControllerFactory的工做 6 /// </summary> 7 public static void Register() 8 { 9 Bootstrapper boot = new Bootstrapper(); 10 boot.Start(); 11 12 //將MVC的控制器對象實例 交由autofac來建立 13 ControllerBuilder.Current.SetControllerFactory(new AutofacControllerFactory()); 14 } 15 }
2、bootstraper開始註冊服務bootstrap
在註冊服務前,咱們先定義一個容器生成器ContainerBuilder,用以註冊服務;接着咱們會獲取當前項目全部引用的程序集,對其中的類型進行判斷,若是符合條件就會註冊進去。那哪些類型會註冊進去呢?緩存
有三種:mvc
1. IDependency,倉儲層和服務層的接口都繼承該接口,註冊的服務會在容器每次resolve的時候,生成一個新對象app
2. ISignleton,日誌和緩存接口繼承該接口,每次解析都會返回統一對象,即單例對象框架
3. Module,其中暴露了ContainerBuilder對象,由模塊自定義註冊方式,項目中webapp層有個MvcControllerModule,用於將全部實現IController給註冊進去webapp
1 public void Start() 2 { 3 Type baseType = typeof(IDependency); 4 5 // 獲取全部相關類庫的程序集 6 Assembly[] assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>().ToArray(); 7 8 containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) 9 .AsImplementedInterfaces().InstancePerDependency();//每次解析得到新實例 10 11 Type singletonType = typeof(ISignleton); 12 containerBuilder.RegisterAssemblyTypes(assemblies).Where(type => singletonType.IsAssignableFrom(type) && !type.IsAbstract) 13 .AsImplementedInterfaces().SingleInstance();// 保證對象生命週期基於單例 14 15 containerBuilder.RegisterAssemblyModules(assemblies);//全部繼承module中的類都會被註冊 16 17 var container = containerBuilder.Build(); 18 ContainerManager.SetContainer(container); 19 }
依賴註冊好後,會生成IOC容器,接着將容器管理器的IOC容器設置爲該容器,之後全部的服務的解析能夠經過管理器來解析。
3、自定義Autofac控制器工廠
第一步中咱們將控制器工廠改成AutofacControllerFactory,這個控制器工廠重寫了GetControllerInstance,主要在解析控制器類型時,用ContainerManager去解析控制器類型,這樣就能把控制器中的依賴給注入進去。
1 protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 2 { 3 if (controllerType == null) 4 { 5 return base.GetControllerInstance(requestContext, controllerType); 6 } 7 8 return ContainerManager.Resolve(controllerType) as IController; 9 }
Git源碼:https://github.com/Halifa/TonyBlogs
如本文對您有幫助請移步右下角,推薦本文,謝謝你們的點贊,由於您的支持是我最大動力