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

C# .NET如何自动实现依赖注入(DI)

为解决重复性的工作,自动实现依赖注入(DI)
在这里插入图片描述
示例代码如下

namespace DialysisSOPSystem.Infrastructure
{public static class ServiceCollectionExtensions{/// <summary>/// 批量注入服务/// </summary>/// <param name="services"></param>/// <returns></returns>public static IServiceCollection RegisterAutoInjectServices(this IServiceCollection services){ArgumentNullException.ThrowIfNull(services);//获取当前Host运行依赖的程序集var context = DependencyContext.Default;var assemblies = context.RuntimeLibraries.SelectMany(lib => lib.GetDefaultAssemblyNames(context)).Select(Assembly.Load).ToList();services.Scan(scan => scan.FromAssemblies(assemblies).AddClasses(classes => classes.AssignableTo<ITransientDependency>()).AsImplementedInterfaces().WithTransientLifetime().AddClasses(classes => classes.AssignableTo<IScopedDependency>()).AsImplementedInterfaces().WithScopedLifetime().AddClasses(classes => classes.AssignableTo<ISingletonDependency>()).AsImplementedInterfaces().WithSingletonLifetime());return services;}}
}
namespace DialysisSOPSystem.Infrastructure
{public interface ITransientDependency { }public interface IScopedDependency { }public interface ISingletonDependency { }
}//1、Transient(瞬态):每次从容器 (IServiceProvider)中获取的时候都是一个新的实例//2、Singleton(单例):每次从同根容器中(同根 IServiceProvider)获取的时候都是同一个实例//3、Scoped(应用程序域单例):每次从同一个容器中获取的实例是相同的、
Startup类
public void ConfigureServices(IServiceCollection services)
{services.RegisterAutoInjectServices();// 添加控制器services.AddControllers();// 添加Swaggerservices.AddEndpointsApiExplorer();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new() { Title = "Dialysis SOP API", Version = "v1" });});// 添加AutoMapperservices.AddAutoMapper(typeof(Startup).Assembly);
}

web 项目引用关系如下
在这里插入图片描述

//这段代码获取程序集,上面的web引用service和接口、仓储var context = DependencyContext.Default;var assemblies = context.RuntimeLibraries.SelectMany(lib => lib.GetDefaultAssemblyNames(context)).Select(Assembly.Load).ToList();//只能拿到当前所在的类库下的程序集
//var assemblies = AppDomain.CurrentDomain.GetAssemblies();
//或者显示引用,就不在web把其他依赖项拉进去// 从指定路径加载程序集
var assemblyPath = Path.Combine(AppContext.BaseDirectory, "YourProject.Services.dll");
var serviceAssembly = Assembly.LoadFrom(assemblyPath);
// 添加到 DI 扫描范围
var assemblies = new[] { serviceAssembly }.Concat(AppDomain.CurrentDomain.GetAssemblies());

相关文章:

  • 【前端样式】用 aspect-ratio 实现等比容器:视频封面与图片占位的终极解决方案
  • 【消息队列RocketMQ】二、RocketMQ 消息发送与消费:原理与实践
  • 【AI】SpringAI 第三弹:接入通用大模型平台
  • Docker 镜像、容器和 Docker Compose的区别
  • 制作一款打飞机游戏15:动画优化
  • ArcGIS、ArcMap查看.shp文件时属性表中文乱码
  • Python-24:小R的随机播放顺序
  • [特殊字符] Prompt如何驱动大模型对本地文件实现自主变更:Cline技术深度解析
  • 【Easylive】AdminFilter 详细解析
  • postman乘法计算,变量赋值
  • 实验五 LCD1602 显示字符串
  • Craft 是什么:腾讯 Cloud Studio 中的 CodeBuddy 提供了 Craft 功能
  • 深入解析 Spring 中的 @Value 注解(含源码级剖析 + 自定义实现)
  • 工具:下载vscode .vsix扩展文件及安装的方法
  • 关于敏感文件或备份 安全配置错误 禁止通过 URL 访问 Vue 项目打包后的 .gz 压缩文件
  • 网络结构及安全科普
  • 机器学习-08-推荐算法-协同过滤
  • SQL问题分析与诊断(8)——分析方法2
  • 常用 SQL 转义符的总结
  • 【目标检测】目标检测综述 目标检测技巧
  • 2025年上海车展后天开幕,所有进境展品已完成通关手续
  • 【社论】地铁读书人也是一道城市风景
  • 一季度浙江实现生产总值22300亿元,同比增长6.0%
  • 北京理工大学解除宫某聘用关系,该教师被指涉嫌骚扰猥亵学生
  • 人民网评:“中国传递爱而不是关税”
  • 收藏家尤伦斯辞世,曾是中国当代艺术的推手与收藏者