.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();
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().As().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 logger)
5         {
6             _logger = logger;
7         }

其中_logger使用构造函数注入,_managerService为属性注入(应声明为public)。