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

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

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

1、添加引用:

 

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)。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章