我们希望尝试提高解决方案的一个微服务的性能,这就是为什么我们决定在数据验证部分尝试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'时出错。.. .
请帮我解决这个问题。
@'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);
}
}
}
}