当前位置: 首页 > 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.jsqmd.com/news/120116/

相关文章:

  • 完整教程:零基础入门C语言之C语言实现数据结构之单链表
  • Hive 3.x 建表指定分桶,但load data后失效的原因
  • GSoC 成果公布!印度开发者为 DolphinScheduler 引入通用 OIDC 认证,实现无缝安全访问
  • 【python大数据毕设实战】哮喘患者症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
  • 【01-02】
  • 【开题答辩全过程】以 基于微信小程序的糖尿病居家健康管理实用的系统为例,包含答辩的问题和答案
  • Qt 源码阅读随笔
  • 2025 我用 Sysinternals 打通 Windows 排障“证据链”:开机慢 / 安装失败 / 磁盘暴涨(三个真实案例复盘)
  • 基于java的SpringBoot/SSM+Vue+uniapp的宠物综合服务平台的详细设计和实现(源码+lw+部署文档+讲解等)
  • [20251219]测试sql语句子光标的执行性能2(21c).txt
  • 面向轻量级智能体的模型蒸馏方法研究-大规模预训练模型知识迁移机制分析
  • 非遗万象图前端开发
  • 不同场景 Linux 性能调优参数配置模板
  • Redis 零基础到进阶,Redis 哨兵监控,笔记63-73
  • 大学生必备:8个免费AI论文工具,告别熬夜搞定论文效率飙升100% - 麟书学长
  • 9 个降AI率工具,MBA 必备避坑指南
  • 用 .NET MAUI 10 + VS Copilot 从 0 开发一个签到 App(三)
  • 上海埃飞电子科技有限公司:探寻国内顶尖狭缝涂布机加工厂的卓越之道 - 五色鹿五色鹿
  • Redis多实例部署与主从架构
  • 【linux内核】Linux内核的同步机制
  • (100分)- 部门人力分配(Java JS Python C)
  • npm2100 的电源转换能力优点
  • [20251218]测试sql语句子光标的执行性能(21c).txt
  • 常用 Linux 性能调优参数速查表
  • Scikit-image 实战指南:10 个让 CV 模型更稳健的预处理技巧
  • AgentScope深入分析-LLMMCP
  • (100分)- 测试用例执行计划(Java JS Python C)
  • Redis高级特性与生产环境部署
  • 详细介绍:正则表达式超详细版
  • 数组去重(JS)