Asp.net Core 中一键注入接口
前言
在之前开发Asp.Net Core程序时遇到接口需要一个一个的注入到Services中,当有非常多的接口需要注入时会显得代码成为了一座山,这里记录一下如何通过接口的命名一键自动注入.
准备
IDE: Visual studio 2022
.Net版本:.Net 8
开始
首先是接口的命名需要规范,列如接口命名为TestDao
,实现类命名为TestDaoImpl
,这里就以Dao
于DaoImpl
来做示范.
新建一个类,命名为ServiceCollectionExtensions
,内容如下:
csharp
public static IServiceCollection AddDaosWithConvention(this IServiceCollection services, Assembly assembly)
{
var interfaceSuffix = "Dao"; // 接口命名结尾
var implementationSuffix = "DaoImpl";// 实现类命名结尾
// 通过反射的机制来寻找所有的接口命名符合interfaceSuffix 结尾的
var interfaceTypes = assembly.GetTypes()
.Where(t => t.IsInterface && t.Name.EndsWith(interfaceSuffix))
.ToArray();
// 通过反射的机制来寻找所有的实现类命名符合interfaceSuffix 结尾的
var types = assembly.GetTypes()
.Where(t => t.IsClass && !t.IsAbstract && t.Name.EndsWith(implementationSuffix))
.ToList();
// 使用AddScoped注入所有符合的接口与实现类
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;
}
使用
在Program.cs
文件中添加:
csharp
builder.Services.AddDaosWithConvention(Assembly.GetExecutingAssembly());
当上述配置完成后,在创建完接口与实现类后可以直接引用,不需要再去注册.