1.安装AutoFac包
2.实现Autofac注册类
/// <summary> /// AutoFac注册类 /// </summary> /// <param name="builder"></param> public class CustomAutofacModule:Module { protected override void Load(ContainerBuilder builder) { builder.RegisterType<TestService>().As<ITestService>(); } }
3.Program中添加UseServiceProviderFactory(new AutofacServiceProviderFactory())
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); webBuilder.UseUrls("http://0.0.0.0:8001"); });
4.startup中(1)新增 属性 AutofacContainer (2)新增方法ConfigureContainer
public ILifetimeScope AutofacContainer { get; private set; } //autofac 新增 public void ConfigureContainer(ContainerBuilder builder) { // 直接用Autofac注册我们自定义的 builder.RegisterModule(new CustomAutofacModule()); }
5.若要实现属性注入
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
6.属性注入
public ITestService _testService { get; set; } /// <summary> /// 测试输出 /// </summary> /// <param name="s"></param> /// <returns></returns> [HttpGet] public string TestConsole(string s) { return _testService.TestConsole(s); }
7.踩坑点记录
(1).Net Core 3.1之后 无法使用 更改ConfigureServices的返回值实现autofac注入,需使用其他方法,见上文步骤 (2)Autofac需添加替换创建代码才可实现属性注入,见下文,属性注入必须为接口类型以及Public权限以及添加get;set;方法 Autofac 替换: 需要在ConfigureServices 方法加入一句代码 services.Replace(ServiceDescriptor.Transient<icontrolleractivator, servicebasedcontrolleractivator="">());这样才真正的替换为autufac,才支持属性注入 为什么? 解释: ASP.Net Core 创建对象默认使用 DefaultControllerActivator 对 控制器进行创建 ,Create 方法中 使用ActivatorUtilities创建对象,替换成 ServiceBasedControllerActivator 中Create方法 使用 IServiceProvider 进行控制器的创建