如何将.Net Minimal APIs动态注册服务功能扩展为?
摘要:.Net Minimal APIs实现动态注册服务 前言 dotnet Minimal APIs实现动态注册端点 上一篇文章讲解了在.Net Minimal APIs如何动态注册端点,这篇文章来讲解一下如何动态注册服务 文件层级结构如下:
.Net Minimal APIs实现动态注册服务
前言
dotnet Minimal APIs实现动态注册端点
上一篇文章讲解了在.Net Minimal APIs如何动态注册端点,这篇文章来讲解一下如何动态注册服务
文件层级结构如下:
SharpIcoWeb
├── Endpoints
│ ├── Internal
│ │ ├── EndpointExtensions.cs
│ │ ├── IEndpoint.cs
│ ├── IcoEndpoints.cs
│ ├── testEndpoints.cs
├── Program.cs
需要修改EndpointExtensions动态注册扩展类、IEndpoint端点注册接口和Program.cs配置类来实现端点+服务的自动注册,当然端点类也需要实现IEndpoint接口新增的方法。
回顾
在开始之前回顾一下如何动态注册端点类:
public static class EndpointExtensions
{
public static void MapAllEndpoints(this IEndpointRouteBuilder app)
{
var endpointTypes = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(t => typeof(IEndpoint).IsAssignableFrom(t) && !t.IsInterface && !t.IsAbstract);
foreach (var type in endpointTypes)
{
type.GetMethod(nameof(IEndpoint.MapEndpoints))?
.Invoke(null, new object[] { app });
}
}
}
代码详解:
主要注册方法在扩展类中,主要分为2步。
查找
第一步: 查找所有实现了IEndpoint的类
Assembly.GetExecutingAssembly() - 获取当前正在执行的程序集
GetTypes() - 获取程序集中所有的类型
Where(...) - 筛选条件:
typeof(IEndpoint).IsAssignableFrom(t) - 类型必须实现 IEndpoint 接口
!t.IsInterface - 排除接口本身
!t.IsAbstract - 排除抽象类(不能被实例化的类)
调用
第二步:对每个端点类,调用它的静态MapEndpoints方法
foreach - 遍历前面找到的所有端点类型
type.GetMethod(nameof(IEndpoint.MapEndpoints)) - 获取名为"MapEndpoints"的方法
nameof(IEndpoint.MapEndpoints) - 安全地获取方法名
?.Invoke(null, new object[] { app }) - 如果方法存在,则调用它
null - 表示是静态方法(不需要实例)
new object[] { app } - 传递参数(IEndpointRouteBuilder)
开始实现
IEndpoint接口
首先在IEndpoint接口中添加用于服务注册的接口成员。
注意:之前的MapAllEndpoints重命名为UseEndpoints了,这个命名更加清晰。
public interface IEndpoint
{
static abstract void UseEndpoints(IEndpointRouteBuilder app);
// 新增 IConfiguration configuration 参数可选
static abstract void AddServices(IServiceCollection services, IConfiguration configuration);
}
端点类
在每个端点类中实现AddServices方法。
