当前位置: 首页 > news >正文

.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);// 自动注册泛型 Repositoryvar 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;
}

 

http://www.rkmt.cn/news/132198.html

相关文章:

  • GSoC 成果公布!印度开发者为 DolphinScheduler 引入通用 OIDC 认证,实现无缝安全访问
  • 面向轻量级智能体的模型蒸馏方法研究-大规模预训练模型知识迁移机制分析
  • [20251219]测试sql语句子光标的执行性能2(21c).txt
  • 不同场景 Linux 性能调优参数配置模板
  • Scikit-image 实战指南:10 个让 CV 模型更稳健的预处理技巧
  • 常用 Linux 性能调优参数速查表
  • AgentScope深入分析-LLMMCP
  • (100分)- 测试用例执行计划(Java JS Python C)
  • Redis高级特性与生产环境部署
  • [20251218]测试sql语句子光标的执行性能(21c).txt
  • NPM2100 支持的电池类型
  • 数组去重(JS)
  • 大专市场营销专业可考取的实用证书
  • NPM2100 超低功耗模式
  • (100分)- ABR 车路协同场景(Java JS Python)
  • PromQL 核心语法解析
  • Boost电路的右半平面零点
  • NPM2100 LDO
  • 智慧城市与智慧校园之安防暴力检测 校园打架斗殴检测 街边暴力躁动识别 危险物品识别 智能安防 安防领域智能化 数据集第10319期 (1)
  • AI Agent的概念形成:模拟LLM的抽象思维过程
  • 云底座 amp; 性能优化 90 天技术提升落地清单
  • 高中语法练习解析100篇-001 - new
  • 智慧铁路之受电弓接触点识别 铁路输电线路鸟巢识别 铁路异物入侵巡检识别 铁路风筝识别 列车绝缘子检测 轨道交通场景下异物识别 户外线缆及附属部件的智能监测 10325期
  • 链动2+1模式AI智能名片S2B2C商城小程序中电商直播的应用机制与价值创新研究
  • 【全球AI伦理治理】
  • 云底座管理与操作系统性能质量保证技术升华
  • 三折叠手机推荐哪个品牌?三星Galaxy Z TriFold用创新重新定义旗舰体验
  • 三折叠手机有什么使用场景和优势?三星Galaxy Z TriFold给出答案
  • springboot购物推荐网站的设计与实现(11541)
  • TEST_40