2020/01/30, ASP.NET Core 3.1, VS2019, Autofac.Extensions.DependencyInjection 5.0.1
摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站架构【9.1-使用Autofac代替原生的依赖注入】
使用Autofac替换原生的依赖注入
本章节介绍了使用Autofac代替原生的依赖注入,使用Autofac为的是后面配合Castle.Core做AOP动态代理
添加包引用
向MS.WebApi
应用程序中添加Autofac.Extensions.DependencyInjection
包:
<ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="5.0.1" />
</ItemGroup>
注意此处包和下一章节会用到Autofac.Extras.DynamicProxy包两者需要配合使用,详情看下一章节
替换DI容器
修改Program.cs
打开Program.cs
类,给Host.CreateDefaultBuilder(args)
添加代码.UseServiceProviderFactory(new AutofacServiceProviderFactory())
:
注意需要添加引用:using Autofac.Extensions.DependencyInjection;
修改Startup.cs
在Startup类中,注释掉原本的构造函数,并添加以下代码:
public ILifetimeScope AutofacContainer { get; private set; }
public Startup(IWebHostEnvironment env)
{
// In ASP.NET Core 3.0 `env` will be an IWebHostingEnvironment, not IHostingEnvironment.
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
//添加autofac的DI配置容器
public void ConfigureContainer(ContainerBuilder builder)
{
}
注意要添加using Autofac;
引用。
完成后如下图所示:
至此,Autofac替换原生依赖注入就完成了,可以在新加的ConfigureContainer
方法中使用Autofac的方法注册服务。
使用
我们把之前写的IBaseService、IRoleService两个服务改成Autofac注册试试。
先把之前的注册删掉:
services.AddScoped<IBaseService, BaseService>();
services.AddScoped<IRoleService, RoleService>();
在ConfigureContainer中添加以下代码:
//注册IBaseService和IRoleService接口及对应的实现类
builder.RegisterType<BaseService>().As<IBaseService>().InstancePerLifetimeScope();
builder.RegisterType<RoleService>().As<IRoleService>().InstancePerLifetimeScope();
完成后,启动项目,打开Postman测试接口,发现服务都是正常被调用的: