.net 8使用autofac以及.net core自带的注入
.net 8配置Autofac
var builder = WebApplication.CreateBuilder(args); // Add services to the container. //autofac注册到builder builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); //服务注册到autofac builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder => { // 示例1:注册单个服务(作用域生命周期) containerBuilder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope(); // 示例2(推荐):批量注册程序集中所有服务 containerBuilder.RegisterAssemblyTypes(typeof(Program).Assembly) .Where(t => t.Name.EndsWith("Service")) .AsImplementedInterfaces() .InstancePerLifetimeScope(); });
2.手动批量注入
public static void AddBusinessServicesForSQLSugar(this IServiceCollection services) { var basePath = AppContext.BaseDirectory; var servicesDllFile = Path.Combine(basePath, "MedicTechService.dll"); var sugarRepositoryDllFile = Path.Combine(basePath, "MedicTech.Repository.dll"); // 加载程序集 var serviceAssembly = Assembly.LoadFrom(servicesDllFile); var sugarRepositoryAssembly = Assembly.LoadFrom(sugarRepositoryDllFile); // 自动注册泛型 Repository var baseRepositoryInterface = typeof(IBaseRepository<,>); var baseRepositoryImplementation = typeof(MedicTech.Repository.Base.BaseRepository<,>); // Fix for CS0119: Ensure the correct syntax is used for registering services in the IServiceCollection. services.AddScoped<IUnitOfWorkManage, UnitOfWorkManage>(); services.AddScoped(baseRepositoryInterface, baseRepositoryImplementation); // 获取服务程序集中定义的所有接口 var serviceInterfaceTypes = serviceAssembly.GetTypes() .Where(t => t.IsInterface) .ToDictionary(t => t.Name, t => t); var repositoryTypes = sugarRepositoryAssembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith("Repository") && !t.IsGenericType) .ToList(); foreach (var repoType in repositoryTypes) { //var interfaceType = repoType.GetInterfaces() // .FirstOrDefault(i => i.Name == $"I{repoType.Name}"); var expectedInterfaceName = $"I{repoType.Name}"; //if (interfaceType != null) //{ // services.AddSingleton(interfaceType, repoType); //} // 在服务程序集中查找匹配的接口 if (serviceInterfaceTypes.TryGetValue(expectedInterfaceName, out var interfaceType)) { // 确保实现类确实实现了该接口 if (interfaceType.IsAssignableFrom(repoType)) { services.AddScoped(interfaceType, repoType); } else { // 处理不匹配的情况(记录日志或抛出异常) throw new InvalidOperationException( $"Repository {repoType.FullName} does not implement expected interface {interfaceType.FullName}"); } } else { // 处理接口未找到的情况 throw new TypeLoadException( $"Could not find interface {expectedInterfaceName} in assembly {serviceAssembly.FullName}"); } } var serviceTypes = serviceAssembly.GetTypes() .Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith("Services")) .ToList(); foreach (var serviceType in serviceTypes) { var interfaceType = serviceType.GetInterfaces() .FirstOrDefault(i => i.Name == $"I{serviceType.Name}"); if (interfaceType != null) { services.AddScoped(interfaceType, serviceType); } } }
3.使用Autofac批量注册
//MedicTechRep类库和MedicTechServer的API //Program.cs builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder => {
var assemblysServices = Assembly.Load("MedicTechRep"); containerBuilder.RegisterAssemblyTypes(assemblysServices) .AsImplementedInterfaces()// 将类型注册为它实现的所有接口。 .InstancePerLifetimeScope()//.InstancePerLifetimeScope() .EnableInterfaceInterceptors();//启用接口拦截器,用于 AOP(面向切面编程)
//注册第二个类库(这个类库不适用接口,直接用服务类 AsImplementedInterfaces EnableInterfaceInterceptors)
var path2 = Path.Combine(basePath, "MedicTechRep2.dll");或者使用路径来注册
var assemblysServices_2 = Assembly.LoadFrom(path2);
containerBuilder.RegisterAssemblyTypes(assemblysServices)
});
//控制类(注意使用注册的服务必须使用接口,直接使用类报错) private readonly IClass1 _class1; public LoginRegisterController(IClass1 class1) :base() { _class1 = class1; } [HttpGet("logintest")] public async Task<ResponseBase> Getlogintest() { ResponseBase res = new ResponseBase(); res.Data = _class1.InputString(); return res; }
静,静,静

浙公网安备 33010602011771号