You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 7中如何注入Minimal Endpoint类?

解决ASP.NET Core 7 Minimal Endpoints结构化拆分的依赖注入问题

你遇到的错误核心是:手动实例化ProductEndpoint时没有传入构造函数必需的IProductRepository实例,且这种方式无法利用ASP.NET Core的DI容器自动完成依赖注入。以下是几种可行的解决方案:

方案一:将端点类注册到DI容器

把ProductEndpoint也注册为服务,让DI容器负责实例化并自动注入依赖:

  1. 在Program.cs中补充注册端点类:
builder.Services.AddTransient<IProductRepository, ProductRepository>();
// 将端点类注册到DI容器
builder.Services.AddTransient<IEndpoint, ProductEndpoint>();
  1. 从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:13:30