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
{
}