当前位置: 首页 > 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.hn-smt.com/news/127280/

相关文章:

  • 轻量级图片信息解析程序
  • Qt 源码阅读随笔
  • 动态 IP 在爬虫、跨境电商如何避开封禁陷阱
  • 我的256天创作纪念日
  • Windows系统文件inetcomm.dll丢失损坏 下载修复方法
  • NPM2100 LDO
  • YOLOv11改进 - C3k2融合 | C3k2融合CBSA 收缩 - 广播自注意力:轻量级设计实现高效特征压缩,优化处理效率 | NeurIPS 2025
  • 5.string类型
  • LLMs之Survey之Agent:《Measuring Agents in Production》翻译与解读
  • XMODEM协议解析
  • 当一部手机定价近两万:三星三折叠价格和功能如何匹配?
  • 自建vs第三方:提示系统监控告警平台选型全攻略
  • CVE-2022-0779
  • CVE-2022-0779
  • 创建型设计模式学习笔记
  • 大模型训练核心技术:优化器与分布式训练详解
  • 基于YOLOv10的鸡检测系统(YOLOv10深度学习+YOLO数据集+UI界面+Python项目+模型)
  • python:报错:ModuleNotFoundError: No module named langchain_community
  • RFSOC学习记录(四)MTS时序分析
  • Agent设计模式与工程化
  • 20251221——读后感8
  • 0-1 从零开始到实现arp 断网
  • python:报错:ModuleNotFoundError: No module named langgraph
  • 开源 + 国产芯片:具身智能的 DeepSeek 时刻来了?
  • gemini简易打开方式(非支持地区简短对话)
  • Thinkphp和Laravel焦作旅游系统vuevue
  • Spring(循环依赖,spring与springboot的区别)
  • 通达信随心买
  • CSS 核心基础:样式表与选择器入门
  • Thinkphp和Laravel基于vue的校园社团管理系统