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);
});

最近在研究这个补补课,参考了其他博主的文章,然后整理成文章,方便以后复习研究,也方便其他人参考,如有错误之处,请指正。谢谢。

参考:

  1. 作者:张飞洪 https://www.bilibili.com/read/cv16997106 出处:bilibili
  2. https://www.cnblogs.com/wanzhangbingfeng/p/16550823.html
posted @ 2022-12-20 15:42  卡啦永远OK  阅读(34)  评论(0)    收藏  举报