從入門到放棄,.net構建博客系統(二):依賴注入

文章目錄:《從入門到放棄,.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     }
View Code

 

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         }
View Code

依賴註冊好後,會生成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         }
View Code

 

demo:http://tonyblogs.top/

Git源碼https://github.com/Halifa/TonyBlogs

如本文對您有幫助請移步右下角,推薦本文,謝謝你們的點贊,由於您的支持是我最大動力

相關文章
相關標籤/搜索