如何将.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方法。
阅读全文