??開源博客項目Blog使用Autofac注冊并管理組件和服務,Autofac是面向.net 的開源IOC容器,支持通過接口、實例、程序集等方式注冊組件和服務,同時支持屬性注入、方法注入等注入方式。本文學習并記錄Blog項目中Autofac的使用方式。
??整個Blog解決方案主要在App.Hosting和App.Framwork項目中使用Autofac,這里的使用指的是注冊Autofac中間件、注冊組件和服務等,不包括在控制器類中傳遞接口實例。
??App.Hosting項目中主要在Program.cs文件中注冊Autofac中間件,如下圖所示,并調用App.Framwork項目中的擴展類注冊相關組件和服務。
??在Program.cs文件的下半部分還調用了App.Framwork項目中的函數賦予全局靜態類Storage中的Container屬性賦予基于Autofac的ILifetimeScope實例對象,以便在需要的地方能通過代碼獲取Autofac注冊的組件。
??App.Framwork項目主要在5個類中調用Autofac相關的類或函數,主要包括:
??1)AutofacModule類,位于AutofacModule.cs,命名空間為App.Framwork. DependencyInjection ,主要以倉儲模式注入組件,該類將解決方案中所有繼承自IScopedDependency 、ISingletonDependency、ITransientDependency等接口的類型注冊為組件,將繼承自IScopedDependency接口的類型注冊為每次使用都創建新實例(InstancePerDependency),將繼承自ISingletonDependency接口的類型注冊為單例模式(SingleInstance),將繼承自ITransientDependency接口的類型注冊為每次請求創建新實例(InstancePerLifetimeScope),同時該類將所有繼承自ControllerBase的類型都注冊為屬性自動注入(PropertiesAutowired)。
??2)ContainerBuilderExtensions類,位于ContainerBuilderExtensions.cs,命名空間為App. Framwork.DependencyInjection.Extensions,該類主要將解決方案的所有程序集中類型以指定字符串結尾的類型注冊為每次請求創建新實例(InstancePerLifetimeScope),在本項目中主要是注冊所有以service結尾的類。
??3)AspectCoreInterceptorAutofacExtensions類,位于AspectCoreInterceptorAutofacExtensions.cs,命名空間為App.Framwork.DependencyInjection. Extensions。該類主要基于AspectCore的動態代理接入Autofac,這個沒有看的太明白。
??4)Storage類,位于Storage.cs,命名空間為App.Framwork,該類的屬性Container類型為ILifetimeScope,在App.Hosting項目的Program.cs中調用app.UseStaticContainer()(該函數定義于App.Framwork項目ApplicationBuilderExtensions類,位于ApplicationBuilderExtensions.cs,命名空間為App.Framwork.DependencyInjection.Extensions)賦予基于Autofac的ILifetimeScope實例對象值。Container屬性主要在Storage類的GetService函數中用于返回指定服務的組件。
參考文獻:
[1]https://gitee.com/miss_you/Blog
[2]https://autofac.org/
[3]https://github.com/autofac/Autofac
[4]https://blog.csdn.net/Mr_Fei/article/details/129199686