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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM