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

.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.kler.cn/a/393986.html

相关文章:

  • git入门环境搭建
  • react 中 useContext Hook 作用
  • JVM 中的完整 GC 流程
  • Python提取PDF和DOCX中的文本、图片和表格
  • Qt_day4_Qt_UI设计
  • 贪心算法入门(二)
  • Vim 编辑器学习笔记
  • wordpress functions文件的作用及详细说明
  • 网络安全:守护数字世界的坚固防线
  • 3D编辑器教程:如何实现3D模型多材质定制效果?
  • opencv常用api
  • python 编程 在 Matplotlib 中 默认预定的所有颜色,可以使用多种方法来指定颜色,包括预定义的颜色名称、十六进制颜色代码、
  • HarmonyOS Next 组件或页面之间的所有通信(传参)方法总结
  • 用 Python 从零开始创建神经网络(三):添加层级(Adding Layers)
  • Rust泛型系统类型推导原理(Rust类型推导、泛型类型推导、泛型推导)为什么在某些情况必须手动添加泛型特征约束?(泛型trait约束)
  • 数据结构——排序(续集)
  • HOW - PPT 制作系列(一)
  • 微搭低代码私有化部署搭建教程
  • AI Netflix 互动视频:Prompt、画面实时生成、无限体验
  • Configuration Drift(配置漂移)
  • 爬虫日常练习
  • 鸿蒙UI开发——使用动画曲线
  • git入门环境搭建
  • 电商系统设计与实现:Spring Boot框架
  • Linux下MySQL的安装(Centos7)
  • 界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图