一、背景
剛接觸.net 6,記錄一下在.net6上是怎么使用Autofac進(jìn)行動(dòng)態(tài)的依賴注入的
二、注入方式
1、新建一個(gè)webapi項(xiàng)目,框架選擇net 6
2、引用Nuget包---Autofac.Extensions.Dependency
3、在Program.cs上添加如下代碼
//依賴注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())//注冊(cè)服務(wù)工廠
.ConfigureContainer<ContainerBuilder>(container =>
{ //添加依賴注入,AddModule是一個(gè)自定義的拓展方法,將依賴注入的方法單獨(dú)提取出來,方便管理
builder.Services.AddModule(container);
});
public static IServiceCollection AddModule(this IServiceCollection services, ContainerBuilder builder, IConfiguration configuration)
{
//初始化配置文件
Type baseType = typeof(IDependency);//自定義的空類
//動(dòng)態(tài)運(yùn)行項(xiàng)目的類庫
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);
}
}
//注冊(cè)程序集的方式添加依賴
builder.RegisterAssemblyTypes(assemblyList.ToArray())
.Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract)//過濾非抽象類,繼承了IDependency接口的類
.AsSelf().AsImplementedInterfaces()
.InstancePerLifetimeScope();//實(shí)例的生命周期
//單獨(dú)注冊(cè)依賴服務(wù)
//注冊(cè)數(shù)據(jù)庫基礎(chǔ)操作和工作單元
builder.RegisterGeneric(typeof(BaseRepository<,>)).As(typeof(IRepository<,>));
builder.RegisterGeneric(typeof(UnitWork<>)).As(typeof(IUnitWork<>));
//注冊(cè)app層
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly());
builder.RegisterType(typeof(RedisCacheContext)).As(typeof(ICacheContext));
builder.RegisterType<MemoryCacheService>().As<ICacheService>().SingleInstance();
return services;
}
4.
或
//依賴注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
以及再startup.cs中添加ConfigureContainer方法
? ?public void ConfigureContainer(ContainerBuilder builder)
? ?{
? ? ? ?ExtAutofac.InitAutofac(builder);
? ?}文章來源:http://www.zghlxwxcb.cn/news/detail-847654.html
在app層文章來源地址http://www.zghlxwxcb.cn/news/detail-847654.html
namespace App
{
public static class ExtAutofac
{
private static IContainer _container;
public static void InitAutofac(ContainerBuilder builder)
{
//注冊(cè)數(shù)據(jù)庫基礎(chǔ)操作和工作單元
builder.RegisterGeneric(typeof(BaseRepository<,>)).As(typeof(IRepository<,>));
builder.RegisterGeneric(typeof(UnitWork<>)).As(typeof(IUnitWork<>));
//注冊(cè)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();
}
}
}
到了這里,關(guān)于.Net6 使用Autofac進(jìn)行依賴注入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!