.NET类库通过依赖注入自动生成控制器/注入端点方案咨询
类库控制器自动注册与端点注入方案
可以实现自动注册类库中的控制器,或者手动注入端点,以下是具体实现方式:
一、自动发现并注册类库中的ApiController
你在类库中编写的ProcessController可以被宿主ASP.NET Core应用自动识别,只需在宿主项目的Program.cs中配置控制器扫描范围,包含类库的程序集:
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务,并指定扫描类库的程序集 builder.Services.AddControllers() .AddApplicationPart(typeof(ProcessController).Assembly); // 传入类库中任意类型的Assembly var app = builder.Build(); // 启用必要的中间件 app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.Run();
这样宿主应用启动时会自动加载类库中的ProcessController,对应的路由规则也会生效,无需在宿主项目中重复编写控制器代码。
二、手动注入端点(轻量替代方案)
如果不想依赖控制器特性,也可以在类库中封装端点注册逻辑,通过扩展方法让宿主应用调用:
类库中编写端点扩展
public static class ProcessEndpointExtensions { public static IEndpointRouteBuilder MapProcessEndpoints(this IEndpointRouteBuilder app) { // 映射GetXXX端点 app.MapGet("/Process/GetXXX", async (IProcessService processService, string xxx) => { var result = await processService.GetXXX(xxx); return Results.Ok(result); }) .WithName("xxxx"); // 映射CreateTask端点 app.MapPost("/Process/CreateTask", async (IProcessService processService, TaskCreateDto dto) => { await processService.CreateTask(dto); return Results.Created(); }); // 映射CompleteTask端点 app.MapPost("/Process/CompleteTask", async (IProcessService processService, string taskId) => { await processService.CompleteTask(taskId); return Results.NoContent(); }); return app; } }
宿主应用中调用扩展
var builder = WebApplication.CreateBuilder(args); // 注册类库中的核心服务 builder.Services.AddScoped<IProcessService, ProcessService>(); var app = builder.Build(); app.UseRouting(); app.UseAuthorization(); // 注入类库中的端点 app.MapProcessEndpoints(); app.Run();
这种方式更灵活,无需依赖控制器,直接通过端点路由暴露类库功能。
三、关键注意事项
- 类库中的控制器建议继承
ControllerBase而非Controller,ControllerBase是WebAPI的专用基类,避免引入MVC视图相关的冗余功能 - 类库需要引用
Microsoft.AspNetCore.Mvc.Core或Microsoft.AspNetCore.App元包,才能使用[ApiController]等WebAPI特性 - 类库中的核心业务服务(如处理任务的
IProcessService)需要通过DI注册到宿主容器,可在类库中编写扩展方法简化注册流程
内容的提问来源于stack exchange,提问作者Ivalberto
相关产品推荐
相关产品推荐

