最小 API ASP.NET core:是否可以在派生的 FlatValidator 中获取 HTTP 动词?

问题描述 投票:0回答:1

我们希望尝试提高解决方案的一个微服务的性能,这就是为什么我们决定在数据验证部分尝试FlatValidator。我对这种方法很陌生,乍一看它看起来非常简单,但我必须在派生类中访问 HttpContext,但它不起作用。

public record class RateRequest(Guid RateId, string Metadata);

public class RateRequestValidator : FlatValidator<RateRequest>
{
    public RateRequestValidator(HttpContext httpContext)
    {
        if (httpContext.Request.Method == HttpMethods.Post)
        {
            ValidIf(m => m.RateId == Guid.Empty, 
                    m => $"Bad HTTP method ({httpContext.Request.Method}).", 
                    m => m.RateId);
        }
        else if (httpContext.Request.Method == HttpMethods.Put)
        {
            ValidIf(m => m.RateId != Guid.Empty, 
                    m => $"Bad HTTP method ({httpContext.Request.Method}).", 
                    m => m.RateId);
        }
    }
}

但它给了我错误:System.AggregateException:'某些服务无法构建(验证服务描述符'ServiceType:System.Validation.IFlatValidator`1 [RateRequest] Lifetime:Transient ImplementType:RateRequestValidator'时出错。.. .

请帮我解决这个问题。

c# httpcontext
1个回答
0
投票

@'Arthur Edgarov' 的建议是正确的。是的,问题与 FlatValidator 无关,无法直接访问 HttpContext,只能通过 IHttpContextAccessor 访问。

// needs to register HttpContextAccessor
builder.Services.AddHttpContextAccessor();
builder.Services.AddFlatValidatorsFromAssembly(typeof(RateRequestValidator).Assembly);

// ......

public record class RateRequest(Guid RateId, string Metadata);

public class RateRequestValidator : FlatValidator<RateRequest>
{
    // and pass IHttpContextAccessor as parameter instead of HttpContext
    public RateRequestValidator(IHttpContextAccessor httpContextAccessor)
    {
        if (httpContextAccessor.HttpContext is HttpContext httpContext)
        {
            if (httpContext.Request.Method == HttpMethods.Post)
            {
                ValidIf(m => m.RateId == Guid.Empty, 
                        m => $"Bad HTTP method ({httpContext.Request.Method}).", 
                        m => m.RateId);
            }
            else if (httpContext.Request.Method == HttpMethods.Put)
            {
                ErrorIf(m => m.RateId == Guid.Empty,
                        m => $"Bad HTTP method ({httpContext.Request.Method}).", 
                        m => m.RateId);
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.