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

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

说明

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

分析逻辑

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

csharp 复制代码
  services.AddScoped(interfaceType, type);

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

csharp 复制代码
 var interfaceSuffix = "Dao";
 var implementationSuffix = "DaoImpl";

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

csharp 复制代码
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结合,批量写入:

csharp 复制代码
            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);
                    }
                }
            }

所有代码

csharp 复制代码
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;
    }
}

一键注入

csharp 复制代码
builder.Services.AddDaosWithConvention(Assembly.GetExecutingAssembly());
相关推荐
武藤一雄8 小时前
.NET 中常见计时器大全
microsoft·微软·c#·.net·wpf·.netcore
武藤一雄1 天前
[.NET] 中 System.Collections.Generic命名空间详解
windows·微软·c#·asp.net·.net·.netcore
van久5 天前
.Net Core 学习:Razor Pages中 HTML 表头字段的两种写法对比
学习·html·.netcore
武藤一雄5 天前
C# 万字拆解线程间通讯?
后端·微软·c#·.net·.netcore·多线程
武藤一雄7 天前
.NET中到底什么是SignalR (持续更新)
后端·微软·c#·asp.net·.net·.netcore·signalr
by__csdn7 天前
第二章 (.NET Core环境搭建)第二节( Visual Studio Code)
ide·vscode·c#·vue·asp.net·.net·.netcore
by__csdn7 天前
第二章 (.NET Core环境搭建)第三节( Visual Studio for Mac)
ide·kubernetes·c#·asp.net·.net·.netcore·visual studio
武藤一雄8 天前
C#:进程/线程/多线程/AppDomain详解
后端·微软·c#·asp.net·.net·wpf·.netcore
武藤一雄8 天前
C#:Linq大赏
windows·后端·microsoft·c#·.net·.netcore·linq
by__csdn8 天前
第一章 (ASP.NET Core入门)第三节( 认识.NET Standard)
后端·c#·asp.net·.net·.netcore·f#·vb.net