ASP.NET Core 7中如何注入Minimal Endpoint类?
解决ASP.NET Core 7 Minimal Endpoints结构化拆分的依赖注入问题
你遇到的错误核心是:手动实例化ProductEndpoint时没有传入构造函数必需的IProductRepository实例,且这种方式无法利用ASP.NET Core的DI容器自动完成依赖注入。以下是几种可行的解决方案:
方案一:将端点类注册到DI容器
把ProductEndpoint也注册为服务,让DI容器负责实例化并自动注入依赖:
- 在Program.cs中补充注册端点类:
builder.Services.AddTransient<IProductRepository, ProductRepository>(); // 将端点类注册到DI容器 builder.Services.AddTransient<IEndpoint, ProductEndpoint>();
- 从DI容器获取所有端点实例并映射路由:
var app = builder.Build(); // 从容器中获取所有实现IEndpoint接口的实例 var endpoints = app.Services.GetServices<IEndpoint>(); foreach (var endpoint in endpoints) { endpoint.MyRoutes(app); // 注意:确保IEndpoint接口定义的方法名与ProductEndpoint中的实现一致 } app.Run();
方案二:使用静态扩展类(更贴合Minimal API风格)
无需实例化类,直接用静态扩展方法组织路由,依赖可直接注入到端点处理方法中:
public static class ProductEndpoints { public static void MapProductRoutes(this WebApplication app) { app.MapPost("/product/create", async (IProductRepository productRepository) => { var product = await productRepository.CreateProduct(); return Results.Ok(product); }); } }
在Program.cs中调用扩展方法完成路由映射:
var app = builder.Build(); app.MapProductRoutes(); // 映射Product相关路由 // 同理可添加Order的扩展方法:app.MapOrderRoutes(); app.Run();
方案三:用ActivatorUtilities手动创建实例
如果不想将端点类注册到DI,可通过ActivatorUtilities从容器中解析依赖并创建实例:
var app = builder.Build(); var productEndpoint = ActivatorUtilities.CreateInstance<ProductEndpoint>(app.Services); var endpoints = new List<IEndpoint> { productEndpoint }; foreach (var endpoint in endpoints) { endpoint.MyRoutes(app); } app.Run();
注意事项
- 检查代码中的方法名一致性:你代码里
ProductEndpoint的路由方法是MyRoutes,但Program.cs中写了MapRoutes,这是笔误会导致编译错误,需统一 - 优先推荐方案二,更符合Minimal API的设计理念,代码简洁且易维护
内容的提问来源于stack exchange,提问作者rabner casandra
相关产品推荐
相关产品推荐

