最小API注册依赖项



我正在尝试注册依赖项,但有一件事很奇怪,那就是使用特定的处理程序。例如,举一个简单的场景,如:

using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var handler = new CustomerHandler(); // Compiler error here
app.MapGet("/customers/{id}",
(
[FromQuery(Name = "msg")]string? name,
[FromRoute(Name = "id")]string id) => handler.Get(id, name));
app.Run();

处理程序在其构造函数中接受单个项。。

public class CustomerHandler
{
private readonly IGetCustomerQuery _getCustomerQuery;
public CustomerHandler(IGetCustomerQuery getCustomerQuery)
{
_getCustomerQuery = getCustomerQuery;
}
public async Task<IResult> Get(string id, string name)
{
return Results.Ok(new Customer { Id = id, Name = name });
}
}

我猜";正确的";如何指定这些依赖关系?我通常会使用BuildServiceProvider()Get<T>()来创建处理程序,但从我所读到的内容来看,这并不理想。所以我想理想的方法是创建这些实例吗?我应该放弃处理方法吗?

请注意,这是一个非常简单的例子,但IGetCustomerQuery将接受数据库的配置设置实例我想使用传统的Web API方法可以在某种程度上减轻这种情况。

新的最小托管模型有了通过WebApplicationBuilder.Services:处理DI的新方法

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<CustomerHandler>(); // register with correct lifetime

builder.Build()将构建服务提供商,然后可以使用最小的API绑定机制来解析处理程序:

app.MapGet("/customers/{id}",
(
[FromQuery(Name = "msg")]string? name,
[FromRoute(Name = "id")]string id,
[FromServices]CustomerHandler handler // possibly attribute can be skipped 
) => handler.Get(id, name));

p.S.

我通常会使用BuildServiceProvider()Get<T>()来创建处理程序

请永远不要那样做。

最新更新