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

ASP.NET Core - 依赖注入 自动批量注入

在这里插入图片描述

依赖注入配置变形

随着业务的增长,我们项目工作中的类型、服务越来越多,而每一个服务的依赖注入关系都需要在入口文件通过Service.Add{}方法去进行注册,这将是非常麻烦的,入口文件需要频繁改动,而且代码组织管理也会变得麻烦,非常不优雅。

在许多框架中会对这种通过 Service.Add{xxx} 的方式在代码中显式注册依赖注入关系的方式进行变形,有的可以通过配置文件进行注册,
这里稍微简单介绍一下依赖注入默认注册的原理,其实也就是通过放射的一些手段,再加上一些约定好的规则而已。

约定 实现类要接口结尾
》Izen 接口
》实现类 MyServiceZen

这里稍微简单介绍一下依赖注入默认注册的原理,其实也就是通过放射的一些手段,再加上一些约定好的规则而已。

public interface ISingleton
{
}
public interface IScoped
{
}
public interface ITransient
{
}

》》定义一个扩展类 实现 IServiceCollection 的扩展方法

namespace Microsoft.Extensions.DependencyInjection
{public static class ServiceCollectionDependencyExtensions{public static IServiceCollection AddAutoInject<T>(this IServiceCollection services){var register = new ServiceRegister();register.AddAssembly(services, typeof(T).Assembly);return services;}}
}

》》》这个扩展方法中调用了注册器,往容器中注入服务,实现如下:


public class ServiceRegister
{public void AddAssembly(IServiceCollection services, Assembly assembly){// 查找程序中的类型var types = assembly.GetTypes().Where(t => t != null && t.IsClass && !t.IsAbstract && !t.IsGenericType);// 遍历每一个类检查释放满足约定的规则foreach (var type in types){AddType(services, type);}}/// <summary>/// 添加当前类型的依赖注入关系/// </summary>/// <param name="services"></param>/// <param name="type"></param>public void AddType(IServiceCollection services, Type type){var lifetime = GetLifetimeOrNull(type);if (lifetime == null){return;var exposeServices = ExposeService(type);foreach (var serviceType in exposeServices){var serviceDescriptor = new ServiceDescriptor(serviceType, type, lifetime.Value);services.Add(serviceDescriptor);}}/// <summary>/// 根据标记接口确定生命周期,如果没有添加标记接口的,则不会被自动注册到容器/// </summary>/// <param name="type"></param>/// <returns></returns>public ServiceLifetime? GetLifetimeOrNull(Type type){if (typeof(ISingleton).IsAssignableFrom(type)){return ServiceLifetime.Singleton;}if(typeof(IScoped).IsAssignableFrom(type)){return ServiceLifetime.Scoped;}if(typeof(ITransient).IsAssignableFrom(type)){return ServiceLifetime.Transient;}return null;}/// <summary>/// 根据约定的规则查找当前类对于的服务类型/// 通过接口实现的方式,查找当前类实现的接口,如果一个接口名称去除了 "I" 之后与当前类的后半段一样,/// 则当前类应该被注册为这个接口的服务。/// </summary>/// <param name="type"></param>/// <returns></returns>public IList<Type> ExposeService(Type type){var serviceTypes = new List<Type>();var interfaces = type.GetInterfaces();foreach (var interfacesType in interfaces){var interfaceName = interfacesType.Name;if (interfaceName.StartsWith("I")){interfaceName = interfaceName.Substring(1);}if (type.Name.EndsWith(interfaceName)){serviceTypes.Add(interfacesType);}}return serviceTypes;}
}

整体的逻辑就是查找遍历程序集中的所有类型,并通过判别类型是否实现之前定好的三个生命周期接口,
从而确定类型是否需要自动注册到容器中,如果需要再根据约定好的规则获取需要注册的服务类型,并且构建服务描述器,再将其添加到容器中。

之后在入口文件中这样使用:
》builder.Services.AddAutoInject();

相关文章:

ASP.NET Core - 依赖注入 自动批量注入

依赖注入配置变形 随着业务的增长&#xff0c;我们项目工作中的类型、服务越来越多&#xff0c;而每一个服务的依赖注入关系都需要在入口文件通过Service.Add{}方法去进行注册&#xff0c;这将是非常麻烦的&#xff0c;入口文件需要频繁改动&#xff0c;而且代码组织管理也会变…...

UVM 验证方法学之interface学习系列文章(十一)virtual interface 再续篇

一 前言 并非总是可以将被测单元(DUT)视为一个黑盒,即仅监控和驱动DUT的顶层端口信号。这一点在从模块级测试转向更大规模的系统级测试时尤为明显。有时,我们需要了解实现细节以便访问DUT内部的信号。这被称为白盒验证。 Verilog一直提供从其他作用域访问几乎任何层次结构…...

面试题整理5----进程、线程、协程区别及僵尸进程处理

面试题整理5----进程、线程、协程区别及僵尸进程处理 1. 进程、线程与协程的区别1.1 进程&#xff08;Process&#xff09;1.2 线程&#xff08;Thread&#xff09;1.3 协程&#xff08;Coroutine&#xff09;2. 总结对比 3. 僵尸进程3.1 什么是僵尸进程&#xff1f;3.2 僵尸进…...

OpenTK 中帧缓存的深度解析与应用实践

摘要: 本文深入探讨了 OpenTK 中帧缓存的使用。首先介绍了帧缓存的基本概念与在图形渲染管线中的关键地位,包括其与颜色缓存、深度缓存、模板缓存等各类缓存的关联。接着详细阐述了帧缓存对象(FBO)的创建、绑定与解绑等操作,深入分析了纹理附件、渲染缓冲区附件在 FBO 中的…...

第2节-Test Case如何调用Object Repository中的请求并关联参数

前提&#xff1a; 已经创建好了project&#xff08;File -> New -> Project&#xff0c;Type&#xff1a;API/WebService&#xff09;&#xff0c;object repository中已经创建了RESTful endpoint&#xff08;Object Repository -> New -> Web Service Request&am…...

【HarmonyOS NEXT】Web 组件的基础用法以及 H5 侧与原生侧的双向数据通讯

关键词&#xff1a;鸿蒙、ArkTs、Web组件、通讯、数据 官方文档Web组件用法介绍&#xff1a;文档中心 Web 组件加载沙箱中页面可参考我的另一篇文章&#xff1a;【HarmonyOS NEXT】 如何将rawfile中文件复制到沙箱中_鸿蒙rawfile 复制到沙箱-CSDN博客 目录 如何在鸿蒙应用中加…...

Android学习(六)-Kotlin编程语言-数据类与单例类

假设我们要创建一个表示书籍的数据类 Book&#xff0c;包含书名和作者两个字段。在 Java 中&#xff0c;代码如下&#xff1a; public class Book { String title; String author; public Book(String title, String author) { this.title title; this.author author; } Ove…...

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接&#xff1a; An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…...

力扣274. H 指数

给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xff09;至少发…...

挑战一个月基本掌握C++(第五天)了解运算符,循环,判断

一 运算符 运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 内置了丰富的运算符&#xff0c;并提供了以下类型的运算符&#xff1a; 算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符 1.1 算术运算符 假设变量 A 的值为 10&#xff0c;变量 B 的值为…...

Python的sklearn中的RandomForestRegressor使用详解

文章目录 Python的sklearn中的RandomForestRegressor使用详解一、引言二、RandomForestRegressor简介1、随机森林回归原理2、RandomForestRegressor的主要参数 三、构建和训练模型1、数据准备2、数据划分3、模型训练 四、模型评估1、预测2、评估指标 五、特征重要性分析六、可视…...

ReactPress 1.6.0:重塑博客体验,引领内容创新

ReactPress 是一个基于Next.js的博客&CMS系统&#xff0c; Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 体验地址&#xff1a;http://blog.gaoredu.com/ 今天&#xff0c;我们自豪地宣布ReactPress 1.6.0版本的正式发布&#xff0c;…...

人脸生成3d模型 Era3D

从单视图图像进行3D重建是计算机视觉和图形学中的一项基本任务&#xff0c;因为它在游戏设计、虚拟现实和机器人技术中具有潜在的应用价值。早期的研究主要依赖于直接在体素上进行3D回归&#xff0c;这往往会导致过于平滑的结果&#xff0c;并且由于3D训练数据的限制&#xff0…...

kubeadm搭建k8s集群

前置环境&#xff1a; 准备三台虚拟机 192.168.1.104&#xff08;用来做k8s的mater节点&#xff09; 192.168.1.105&#xff08;节点node2&#xff09; 192.168.1.109&#xff08;节点node3&#xff09; 关闭防火墙 systemctl stop firewalld systemctl disable firewalld安装…...

centOS系统进程管理基础知识

进程的概念与属性 1.进程是系统中正在执行的代码片段&#xff0c;也可以称为一个程序。 2.操作系统通过分配进程编号&#xff08;PID&#xff09;来管理进程。 3.进程属性包括PID、PPID、UID、GID、状态、优先级、终端名和资源占用等。 PS命令与进程查看 1.PS命令用于查看进程…...

STM32中ADC模数转换器

一、ADC简介 ADC模拟-数字转换器 ADC可以将引脚连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁 12位逐次逼近型ADC&#xff0c;1us转换时间 输入电压范围&#xff1a; 0~3.3V&#xff0c;转换结果范围&#xff1a;0~4095 18个输入…...

初学stm32 --- 外部中断

目录 STM32 IO 口中断基础知识 相关库函数&#xff1a; 使用 IO 口外部中断的一般步骤 STM32 IO 口中断基础知识 STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位&#xff0c;每个中断/事件都有独立…...

wordpress调用指定分类ID下 相同标签的内容

要在WordPress中调用分类ID为1、3、7的分类下&#xff0c;具有相同标签的前10个内容&#xff0c;可以使用自定义的WordPress查询(WP_Query)。以下是实现此功能的步骤和示例代码&#xff1a; 步骤&#xff1a; 确定共同标签&#xff1a; 首先&#xff0c;你需要确定分类1、3、…...

SQL语法基础知识总结

一、引言 在当今数字化时代&#xff0c;数据的存储和管理至关重要。SQL&#xff08;Structured Query Language&#xff09;&#xff0c;即结构化查询语言&#xff0c;是用于管理关系型数据库的强大工具。无论是开发 Web 应用、进行数据分析还是处理企业级数据&#xff0c;掌握…...

css 实现呼吸灯效果

先看效果&#xff1a; 动画的结果就想实在呼吸,完整的代码如下&#xff1a; <template><div class"container"><div class"long-breath"></div></div> </template><style lang"less"> html, body{h…...

CentOS7虚拟机网络配置全攻略:从ifconfig不显示ens33到FinalShell成功连接

CentOS7虚拟机网络配置全攻略&#xff1a;从ifconfig不显示ens33到FinalShell成功连接 刚接触Linux虚拟机的开发者或运维新手&#xff0c;经常会遇到一个令人头疼的问题&#xff1a;启动CentOS7虚拟机后&#xff0c;输入ifconfig命令&#xff0c;发现根本没有显示ens33网卡信息…...

Qwen-Image-Edit-2509入门指南:无需代码,用自然语言编辑图片

Qwen-Image-Edit-2509入门指南&#xff1a;无需代码&#xff0c;用自然语言编辑图片 1. 什么是Qwen-Image-Edit-2509&#xff1f; 想象一下&#xff0c;你只需要对着电脑说"把这张照片里的蓝天换成夕阳"&#xff0c;图片就自动完成了修改——这就是Qwen-Image-Edit…...

阿里通义Z-Image-Turbo WebUI图像生成模型:从安装到生成,一站式教程

阿里通义Z-Image-Turbo WebUI图像生成模型&#xff1a;从安装到生成&#xff0c;一站式教程 1. 引言 在当今数字内容创作蓬勃发展的时代&#xff0c;AI图像生成技术正以前所未有的速度改变着我们的创作方式。阿里通义实验室推出的Z-Image-Turbo模型&#xff0c;凭借其出色的图…...

昇腾910B+MindIE实战:从零部署DeepSeek-R1-Distill-Qwen-32B推理服务

1. 昇腾910B与MindIE环境准备 在Atlas 800I A2服务器上部署DeepSeek-R1-Distill-Qwen-32B模型&#xff0c;首先需要搭建好基础运行环境。我最近刚完成了一个类似项目的部署&#xff0c;整个过程虽然有些复杂&#xff0c;但只要按照步骤操作&#xff0c;2-3小时就能搞定。 操作系…...

Qwen2.5-7B-Instruct入门指南:7B模型对输入token长度的鲁棒性压力测试

Qwen2.5-7B-Instruct入门指南&#xff1a;7B模型对输入token长度的鲁棒性压力测试 1. 项目概述 Qwen2.5-7B-Instruct是阿里通义千问系列的旗舰级大模型&#xff0c;相比1.5B和3B轻量版本&#xff0c;7B参数规模带来了质的飞跃。这个模型在逻辑推理、长文本创作、复杂代码编写…...

多模态扩展:OpenClaw结合Qwen3.5-4B-Claude处理截图信息

多模态扩展&#xff1a;OpenClaw结合Qwen3.5-4B-Claude处理截图信息 1. 为什么需要多模态能力 作为一个长期依赖文本交互的技术爱好者&#xff0c;我最初对OpenClaw的理解停留在"能通过自然语言控制电脑的AI助手"层面。直到上个月需要处理大量产品截图中的文字信息…...

从nvidia-smi到npu-smi:给CUDA开发者的华为昇腾NPU监控指南

从nvidia-smi到npu-smi&#xff1a;CUDA开发者快速掌握昇腾NPU监控的实战手册 当你的技术栈从英伟达GPU扩展到华为昇腾NPU时&#xff0c;监控工具的使用体验就像从自动挡切换到手动挡——虽然最终目的地相同&#xff0c;但操作逻辑需要重新适应。作为曾经每天与nvidia-smi打交道…...

S2-Pro算法能力深度评测:在经典LSTM时间序列预测任务中的表现

S2-Pro算法能力深度评测&#xff1a;在经典LSTM时间序列预测任务中的表现 1. 评测背景与目标 时间序列预测一直是机器学习领域的经典难题&#xff0c;而LSTM作为处理序列数据的利器&#xff0c;被广泛应用于金融、气象、工业等领域。本次评测聚焦S2-Pro大模型在算法实现与优化…...

AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库

内置组件库&#xff08;Element Plus、Ant Design Vue、Vant&#xff09; VTJ 通过其统一的物料系统架构&#xff0c;与三个流行的 Vue 组件库提供了全面的集成。这一抽象层使开发者能够利用熟悉的组件模式&#xff0c;同时保持低代码的可扩展性和跨库的可移植性。该系统将组件…...

用ESP32和VS1053模块DIY网络收音机:从硬件接线到Arduino代码调试全流程

用ESP32和VS1053打造智能网络收音机&#xff1a;从元器件选型到音频流调试实战 在物联网和智能硬件蓬勃发展的今天&#xff0c;ESP32凭借其出色的无线连接能力和丰富的外设接口&#xff0c;成为DIY音频项目的理想选择。本文将手把手带你完成一个功能完整的网络收音机项目&#…...