0
点赞
收藏
分享

微信扫一扫

.Net6中使用Autofac并进行模块化配置

进击的包籽 2022-03-22 阅读 87
c#

1、Program.cs中进行配置

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
{
    // builder.AutofacExtensions();
    builder.RegisterModule<ApiModule>();
    builder.RegisterModule<FirstDemoUtilityModule>();
});

var app = builder.Build();

2、ApiModule模块化配置、并实现容器的功能

using Autofac;

public class ApiModule : Autofac.Module
{
    protected override void Load(ContainerBuilder builder)
    {
        // 获取所有创建的项目Lib
        var libs = DependencyContext.Default
        .CompileLibraries
        .Where(x => !x.Serviceable && x.Type == "project").ToList();

        // 将lib转成Assembly
        List<Assembly> assemblies = new();
        foreach (var lib in libs)
        {
            assemblies.Add(AssemblyLoadContext.Default
            .LoadFromAssemblyName(new AssemblyName(lib.Name)));
        }

        // 反射获取其中所有的被接口修饰的类型,并区分生命周期
        builder.RegisterAssemblyTypes(assemblies.ToArray())
            .Where(t => t.IsAssignableTo<IocTagScope>() && !t.IsAbstract)
            .AsSelf()
            .AsImplementedInterfaces()
            .InstancePerLifetimeScope()
            .PropertiesAutowired();

        builder.RegisterAssemblyTypes(assemblies.ToArray())
            .Where(t => t.IsAssignableTo<IocTagSington>() && !t.IsAbstract)
            .AsSelf()
            .AsImplementedInterfaces()
            .SingleInstance()
            .PropertiesAutowired();

        builder.RegisterAssemblyTypes(assemblies.ToArray())
            .Where(t => t.IsAssignableTo<IocTagTransient>() && !t.IsAbstract)
            .AsSelf()
            .AsImplementedInterfaces()
            .PropertiesAutowired();

        builder.RegisterAssemblyTypes(assemblies.ToArray())
            .Where(t => t.IsAssignableTo<ControllerBase>() && !t.IsAbstract)
            .AsSelf()
            .PropertiesAutowired();
    }
}

3、定义三种生命周期的标注接口:

Scope(范围)、Sington(单例)、Transient(瞬时)

public interface IocTagScope
{
        
}

public interface IocTagSington
{
        
}

public interface IocTagTransient
{
        
}

4、使用三种生命周期的标注接口:

public interface IScopedService : IocTagScope
{
        
}

public interface ISingletonService : IocTagSington
{
        
}

public interface ITransientSerivce : IocTagTransient
{
        
}
举报

相关推荐

0 条评论