一、背景
刚接触.net 6,记录一下在.net6上是怎么使用Autofac进行动态的依赖注入的
二、注入方式
1、新建一个webapi项目,框架选择net 6
2、引用Nuget包---Autofac.Extensions.Dependency
3、在Program.cs上添加如下代码
cs
//依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())//注册服务工厂
.ConfigureContainer<ContainerBuilder>(container =>
{ //添加依赖注入,AddModule是一个自定义的拓展方法,将依赖注入的方法单独提取出来,方便管理
builder.Services.AddModule(container);
});
cs
public static IServiceCollection AddModule(this IServiceCollection services, ContainerBuilder builder, IConfiguration configuration)
{
//初始化配置文件
Type baseType = typeof(IDependency);//自定义的空类
//动态运行项目的类库
var compilationLibrary = DependencyContext.Default
.RuntimeLibraries
.Where(x => !x.Serviceable
&& x.Type == "project")
.ToList();
var count1 = compilationLibrary.Count;
List<Assembly> assemblyList = new List<Assembly>();
foreach (var _compilation in compilationLibrary)
{
try
{
assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
}
catch (Exception ex)
{
Console.WriteLine(_compilation.Name + ex.Message);
}
}
//注册程序集的方式添加依赖
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)//过滤非抽象类,继承了IDependency接口的类
.AsSelf().AsImplementedInterfaces()
.InstancePerLifetimeScope();//实例的生命周期
//单独注册依赖服务
//注册数据库基础操作和工作单元
builder.RegisterGeneric(typeof(BaseRepository<,>)).As(typeof(IRepository<,>));
builder.RegisterGeneric(typeof(UnitWork<>)).As(typeof(IUnitWork<>));
//注册app层
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
builder.RegisterType(typeof(RedisCacheContext)).As(typeof(ICacheContext));
builder.RegisterType<MemoryCacheService>().As<ICacheService>().SingleInstance();
return services;
}
或
cs
//依赖注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
以及再startup.cs中添加ConfigureContainer方法
public void ConfigureContainer(ContainerBuilder builder)
{
ExtAutofac.InitAutofac(builder);
}
在app层
cs
namespace App
{
public static class ExtAutofac
{
private static IContainer _container;
public static void InitAutofac(ContainerBuilder builder)
{
//注册数据库基础操作和工作单元
builder.RegisterGeneric(typeof(BaseRepository<,>)).As(typeof(IRepository<,>));
builder.RegisterGeneric(typeof(UnitWork<>)).As(typeof(IUnitWork<>));
//注册app层
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
builder.RegisterType(typeof(RedisCacheContext)).As(typeof(ICacheContext));
builder.RegisterType(typeof(HttpContextAccessor)).As(typeof(IHttpContextAccessor));
InitDependency(builder);
}
/// <summary>
/// 注入所有继承了IDependency接口
/// </summary>
/// <param name="builder"></param>
private static void InitDependency(ContainerBuilder builder)
{
Type baseType = typeof(IDependency);
var compilationLibrary = DependencyContext.Default
.CompileLibraries
.Where(x => !x.Serviceable
&& x.Type == "project")
.ToList();
var count1 = compilationLibrary.Count;
List<Assembly> assemblyList = new List<Assembly>();
foreach (var _compilation in compilationLibrary)
{
try
{
assemblyList.Add(AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(_compilation.Name)));
}
catch (Exception ex)
{
Console.WriteLine(_compilation.Name + ex.Message);
}
}
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)
.AsSelf().AsImplementedInterfaces()
.InstancePerLifetimeScope();
}
}
}