public class ValidationBehavior : IPipelineBehavior where T1 : IRequest where T2 : Outcome, new() {
private readonly IEnumerable _validators;
public ValidationBehavior(IEnumerable validators) {
_validators = validators;
} // ValidationBehavior
public Task Handle(T1 request, RequestHandlerDelegate next, CancellationToken cancellationToken) {
List errors = _validators
.Select(x => x.Validate(request))
.SelectMany(x => x.Errors)
.Where(x => x != null)
.Select(x => new Error(x.PropertyName, x.ErrorMessage))
.ToList();
if (errors.Any()) {
T2 Outcome = new T2 { Status = Status.Invalid, Payload = new Payload(errors) };
return Task.FromResult(Outcome);
}
return next();
} // Handle
< /code>
Затем я зарегистрировал его с помощью: < /p>
builder.Services.AddMediatR(x => {
x.RegisterServicesFromAssemblyContaining
();
x.AddOpenBehavior(typeof(ValidationBehavior));
}).AddBehaviors();
< /code>
Я получаю следующую ошибку при попытке получить Validation Servicebehavior: < /p>
System.ArgumentException: Arity of open generic service type 'MediatR.IPipelineBehavior`2[TRequest,TResponse]' does not equal arity of open generic implementation type 'ValidationBehavior`3[TRequest,TResponse,T]'. (Parameter 'descriptors')
< /code>
Похоже, что регистрация Mediatr принимает только ipipelinebehaviors с 2 универсальными типами: < /p>
services.AddMediatR(cfg => {
cfg.AddBehavior();
cfg.AddOpenBehavior(typeof(OuterBehavior));
cfg.AddOpenBehavior(typeof(InnerBehavior));
cfg.AddOpenBehavior(typeof(ConstrainedBehavior));
});
Использование Net9 у меня есть следующее поведение Mediatr: < /p> [code]public class ValidationBehavior : IPipelineBehavior where T1 : IRequest where T2 : Outcome, new() {
private readonly IEnumerable _validators;
public ValidationBehavior(IEnumerable validators) { _validators = validators; } // ValidationBehavior
public Task Handle(T1 request, RequestHandlerDelegate next, CancellationToken cancellationToken) {
List errors = _validators .Select(x => x.Validate(request)) .SelectMany(x => x.Errors) .Where(x => x != null) .Select(x => new Error(x.PropertyName, x.ErrorMessage)) .ToList();
if (errors.Any()) { T2 Outcome = new T2 { Status = Status.Invalid, Payload = new Payload(errors) }; return Task.FromResult(Outcome); }
return next();
} // Handle < /code> Затем я зарегистрировал его с помощью: < /p> builder.Services.AddMediatR(x => { x.RegisterServicesFromAssemblyContaining (); x.AddOpenBehavior(typeof(ValidationBehavior)); }).AddBehaviors(); < /code> Я получаю следующую ошибку при попытке получить Validation Servicebehavior: < /p> System.ArgumentException: Arity of open generic service type 'MediatR.IPipelineBehavior`2[TRequest,TResponse]' does not equal arity of open generic implementation type 'ValidationBehavior`3[TRequest,TResponse,T]'. (Parameter 'descriptors') < /code> Похоже, что регистрация Mediatr принимает только ipipelinebehaviors с 2 универсальными типами: < /p> services.AddMediatR(cfg => { cfg.AddBehavior(); cfg.AddOpenBehavior(typeof(OuterBehavior)); cfg.AddOpenBehavior(typeof(InnerBehavior)); cfg.AddOpenBehavior(typeof(ConstrainedBehavior)); }); [/code] Как я могу это решить?
При использовании net9 у меня наблюдается следующее поведение MediaTr:
public class ValidationBehavior : IPipelineBehavior where T1 : IRequest where T2 : Outcome, new() {
У меня есть приложение Blazor с сервером и клиентом, где у клиента есть общий сервис, который используется для операций CRUD для всех различных типов в моем проекте. Затем эта универсальная служба вызывает определенный контроллер на сервере, который...