当前位置: 首页 > 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());
http://www.xdnf.cn/news/60787.html

相关文章:

  • AI大模型如何重塑科研:从灵感生成到学术写作的全链路变革
  • CH585单片机的LCD外设怎么驱动段式LCD
  • 【matlab】地图上的小图
  • 基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战
  • Linux学习笔记协议篇(六):SPI FLASH设备驱动
  • 华为VRP系统知识总结及案例试题
  • 下载pycharm遇到的问题及解决方法
  • 深度学习3.5图像分类数据集
  • elastic/go-elasticsearch与olivere/elastic
  • 乐家桌面安卓版2025下载-乐家桌面软件纯净版安装分享码大全
  • 【scikit-learn基础】--『监督学习』之 均值聚类
  • GPT,Genini, Claude Llama, DeepSeek,Qwen,Grok,选对LLM大模型真的可以事半功倍!
  • 发布事件和Insert数据库先后顺序
  • GeoJSON 格式详解与使用指南
  • Macbook IntelliJ IDEA终端无法运行mvn命令
  • 【2025面试Java常问八股之redis】zset数据结构的实现,跳表和B+树的对比
  • 1.Vue3 - 创建Vue3工程
  • JavaEE--2.多线程
  • RHCE 练习二:通过 ssh 实现两台主机免密登录以及 nginx 服务通过多 IP 区分多网站
  • 【基础算法】二分算法详解
  • 科大讯飞Q1营收46.6亿同比增长27.7%,扣非净利同比增长48.3%
  • [c语言日寄]免费文档生成器——Doxygen在c语言程序中的使用
  • uniapp-商城-31-shop页面中的 我的订单
  • 【大语言模型DeepSeek+ChatGPT+python】最新AI-Python机器学习与深度学习技术在植被参数反演中的核心技术应用
  • idea使用docker插件一键部署项目
  • Time to event :Kaplan-Meier曲线、Log Rank检验与Shiny R
  • Oracle EBS R12.2 安装 -- Step by Step
  • 利用Qt创建一个模拟问答系统
  • Oracle expdp的 EXCLUDE 参数详解
  • 【橘子大模型】Tools/Function call