天天看點

.netcore3.1——使用Autofac替換系統依賴注入元件

.netcore内置依賴注入,通過services.AddTransient、services.AddScoped、services.AddSingleton這些方法即可實作構造函數注入。

Autofac可完美替換系統的依賴注入功能,可實作構造函數注入和屬性注入,替換過程:

1、添加引用:

.netcore3.1——使用Autofac替換系統依賴注入元件
2、Program修改:

1         public static IHostBuilder CreateHostBuilder(string[] args) =>
2             Host.CreateDefaultBuilder(args)
3             .UseServiceProviderFactory(new AutofacServiceProviderFactory())//內建Autofac
4             .ConfigureWebHostDefaults(webBuilder =>
5             {
6                 webBuilder.UseStartup<Startup>();
7             });      

這裡就加了一行

3、Startup修改:

1         //內建Autofac
2         public void ConfigureContainer(ContainerBuilder builder)
3         {
4             //添加依賴注入執行個體,AutofacModuleRegister就繼承自Autofac.Module的類
5             builder.RegisterModule(new StartupHelp.AutofacModuleRegister());
6         }      

這是新加的方法,由Autofac來調用,裡面就是注冊依賴的地方,此處使用了外置對象來注入

4、注入實作AutofacModuleRegister如下:

1     public class AutofacModuleRegister : Autofac.Module
 2     {
 3         protected override void Load(ContainerBuilder builder)
 4         {
 5             //程式集範圍注入
 6             builder.RegisterAssemblyTypes(typeof(ManagerService).Assembly)
 7                  .Where(t => t.Name.EndsWith("Service"))
 8                  .AsImplementedInterfaces().PropertiesAutowired();
 9             //單個注冊
10             builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().PropertiesAutowired();
11 
12             //在控制器中使用屬性依賴注入,其中注入屬性必須标注為public
13             var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
14             .Where(type => typeof(Microsoft.AspNetCore.Mvc.ControllerBase).IsAssignableFrom(type)).ToArray();
15             builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
16         }
17     }      

其中注冊類必須繼承自Autofac.Module,并且在Load中實作注入,此處應用了程式集範圍的注入以及單個對象的注入,最後添加的代碼是為了支援控制器的屬性注入。

注入的接口(如IUnitOfWork)和實作(UnitOfWork)沒有特别。

注入對象的生命周期與.netcore内置的一緻。

5、使用,可以通過構造函數注入和屬性注入,如下:

1         public IManagerService _managerService { get; set; }
2         private readonly ILogger _logger;
3 
4         public AccountController(ILogger<AccountController> logger)
5         {
6             _logger = logger;
7         }      

其中_logger使用構造函數注入,_managerService為屬性注入(應聲明為public)。 

作者:屈魯奇

出處:https://www.cnblogs.com/quluqi

聯系:[email protected] QQ:496195435

本文版權歸作者和部落格園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。如有問題或建議,請多多賜教,非常感謝。

繼續閱讀