Asp.NetCore 6.0 Autofac依赖注入
1. Nuget引入
Autofac.Extensions.DependencyInjection
Microsoft.Extensions.DependencyModel
2. 注册Autofac服务工厂
要注册自定义IoC容器,通常需要注册不同的IServiceProviderFactory,IServiceProviderFactory将创建一个ServiceProvider实例。如果第三方容器支持ASP.NET Core,则必须提供一个该工厂类。如果你要使用Autofac,则需要使用AutofacServiceProviderFactory
在program.cs中添加一个静态类,扩展方法UseAutofacServicePorviderFactory
public static class IAutoFacInjectionExtension
{
public static IHostBuilder UseAutofacServicePorviderFactory(this IHostBuilder hostBuilder)
{
hostBuilder.UseServiceProviderFactory(new AutofacServiceProviderFactory());
return hostBuilder;
}
}
然后执行改方法,注册Autofac,后面就可以使用autofac代替自带的DI进行注入
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseAutofacServicePorviderFactory();
builder.Host.ConfigureContainer<ContainerBuilder>(container=>
{
//单独注册以来服务
container.RegisterType<TestAppService>().As<ITestAppService>();
});e
当然,这样的效果跟自带的DI没两样,至少,你还是要逐个服务注入,比如我现在添加一个ITest2AppService接口和Test2AppService实现类,需要新增一行container.RegisterType<Test2AppService>().As<ITest2AppService>();添加到容器
那么,有没有一些便捷方案,能够自动添加呢?下面来介绍一下利用反射添加程序集的方式。
3. 添加程序集
首先新建一个空的接口IDependency,所有要注册的服务都要继承这个接口
public interface ITestAppService:IDependency
{
int Calculate(int a,int b);
}
然后项目Install-Package Microsoft.Extensions.DependencyModel
在静态类中添加扩展方法如下
public static IServiceCollection AddModule(this IServiceCollection services,ContainerBuilder builder,IConfiguration configuration)
{
Type baseType=typeof(IDependency);
//动态运行项目类库
var comLib=DependencyContext.Default
.RuntimeLibraries
.Where(x=>!x.Serviceable&&x.Type=="project")
.ToList();
List<Assembly> assemblyList=new List<Assembly>();
foreach(var com in comLib)
{
try
{
assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(com.Name)));
}
catch(Exception ex)
{
Console.WriteLine(com.Name+ex.Message);
}
}
//注册程序集的方式添加依赖
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type=>baseType.IsAssignableFrom(type)&&!type.IsAbstract)//过滤非抽象类,继承了IDependency接口的类
.AsSelf().AsImplementedInterfaces()
.InstancePerLifetimeScope();//实例的生命周期
return services;
}
然后再调用上述方法实现注入
builder.Host.ConfigureContainer<ContainerBuilder>(container=>
{
//单独注册以来服务
//container.RegisterType<TestAppService>().As<ITestAppService>();
//注入service程序集
builder.Services.AddModule(container,builder.Configuration);
});
最近在研究这个补补课,参考了其他博主的文章,然后整理成文章,方便以后复习研究,也方便其他人参考,如有错误之处,请指正。谢谢。
参考:

浙公网安备 33010602011771号