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

.Net Core根据文件名称自动注入服务

.Net Core根据文件名称自动注入服务

  • 说明
  • 分析逻辑
  • 所有代码
  • 一键注入

说明

这个适用于.Net Core 的Web项目,且需要在服务中注入接口的需求.因为之前些Java Web习惯了,所以会有Dao层,Serivce层和Controller层.但是如果一个项目里面对于不同的数据库会有多个Dao,如果一个一个引入会造成代码.可读性变差.使用以下方法可以根据文件命名来提取固定的接口与实现类,并自动注入 到服务中.

分析逻辑

首先知道注入接口的方法为:

  services.AddScoped(interfaceType, type);

通过映射的方法扫描项目中所有文件命名(如果怕效率低也可以只扫描制定目录下文件),我这里定义接口以Dao结尾,实现类以DaoImpl结尾,以此定义两个变量:

 var interfaceSuffix = "Dao";var implementationSuffix = "DaoImpl";

然后根据检索文件名称,拿到接口与实现类的列表:

var interfaceTypes = assembly.GetTypes().Where(t => t.IsInterface && t.Name.EndsWith(interfaceSuffix)).ToArray();var types = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith(implementationSuffix)).ToList();

再将两个list结合,批量写入:

            foreach (var interfaceType in interfaceTypes){foreach (var type in types){var interfaceName = type.GetInterfaces().FirstOrDefault(i => i.Name == interfaceType.Name)?.Name;if (interfaceName != null){services.AddScoped(interfaceType, type);}}}

所有代码

public static class ServiceCollectionExtensions
{public static IServiceCollection AddDaosWithConvention(this IServiceCollection services, Assembly assembly){var interfaceSuffix = "Dao";var implementationSuffix = "DaoImpl";var interfaceTypes = assembly.GetTypes().Where(t => t.IsInterface && t.Name.EndsWith(interfaceSuffix)).ToArray();var types = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith(implementationSuffix)).ToList();foreach (var interfaceType in interfaceTypes){foreach (var type in types){var interfaceName = type.GetInterfaces().FirstOrDefault(i => i.Name == interfaceType.Name)?.Name;if (interfaceName != null){services.AddScoped(interfaceType, type);}}}return services;}
}

一键注入

builder.Services.AddDaosWithConvention(Assembly.GetExecutingAssembly());
http://www.lryc.cn/news/484409.html

相关文章:

  • APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
  • 第 3 章 -GO语言 基本语法
  • 【qt】控件
  • 入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
  • 【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
  • 【设计模式】行为型模式(二):策略模式、命令模式
  • STM32中断系统
  • window的Anaconda Powershell Prompt 里使用linux 命令
  • Lisp 语言入门教程(一)
  • Git - Think in Git
  • jmeter常用配置元件介绍总结之用linux服务器压测
  • VL210-Q4 适用于USB延长线 扩展坞
  • 怎么样绑定域名到AWS(亚马逊云)服务器
  • Clickhouse集群新建用户、授权以及remote权限问题
  • OPENCV 检测直线[opencv--3]
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析
  • 【MATLAB】目标检测初探
  • SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)
  • 厘清标准差和标准误:因果推断的统计学基础
  • GESP4级考试语法知识(贪心算法(二))
  • MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量
  • LeetCode 热题100(八)【二叉树】(3)
  • uniapp h5实现录音
  • 字节跳动Android面试题汇总及参考答案(80+面试题,持续更新)
  • 【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作
  • PSRR仿真笔记
  • AUTOSAR_EXP_ARAComAPI的7章笔记(3)
  • WSADATA 关键字详细介绍
  • Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III
  • Area-Composition模型部署指南