2017-05-19 3 views
2

Je travaille actuellement sur le comportement du pipeline dans Mediatr 3 pour la validation de la demande. Tous les exemples que j'ai rencontrés lançaient ValidationException si des échecs se produisaient, au lieu de le faire, je veux retourner la réponse avec l'erreur. Quelqu'un a une idée sur la façon de le faire?Réponse de retour avec erreurs au lieu de lancer une exception dans le pipeline de validation mediatr 3

est sous le code pour le pipeline de validation:

public class ValidationPipeline<TRequest, TResponse> : 
    IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> 
{ 
    private readonly IEnumerable<IValidator<TRequest>> _validators; 

    public ValidationPipeline(IEnumerable<IValidator<TRequest>> validators) 
    { 
     _validators = validators; 
    } 

    public Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next) 
    { 
     var failures = _validators 
      .Select(v => v.Validate(request)) 
      .SelectMany(result => result.Errors) 
      .Where(f => f != null) 
      .ToList(); 

     if (failures.Any()) 
     { 
      throw new ValidationException(failures); 
     } 

     return next(); 
    } 
} 

Note: Je trouve cette question Handling errors/exceptions in a mediator pipeline using CQRS? et je suis intéressé par la 1ère option sur la réponse, mais aucun exemple clair sur la façon de le faire.

C'est ma classe de réponse:

public class ResponseBase : ValidationResult 
{ 
    public ResponseBase() : base() { } 

    public ResponseBase(IEnumerable<ValidationFailure> failures) : base(failures) { 
    } 
} 

et j'ajouté sous la signature dans la classe de pipeline de validation:

public class ValidationPipeline<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse> 
where TResponse : ResponseBase 

Je l'ai fait alors dans la méthode de la poignée:

var response = new ResponseBase(failures); 
return Task.FromResult<TResponse>(response); 

Mais cela m'a donné l'erreur «ne peut pas convertir en TResponse».

+0

'renvoie la réponse à la error' - A quoi ressemble la "réponse"? – Alex

+0

Le pipeline 'TResponse' sera le même que le gestionnaire sous-jacent' TResponse' - le 'ResponseBase: ValidationResult' ressemble à une odeur de code pour moi. Je ne suis pas clair sur ce que vous essayez d'atteindre. – Alex

+0

J'essaie d'hériter de la classe ValidationResult de FluentValidation – anggiputper

Répondre

0

Il suffit de ne pas appeler next s'il y a des échecs:

public Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next) 
{ 
    var failures = _validators 
     .Select(v => v.Validate(request)) 
     .SelectMany(result => result.Errors) 
     .Where(f => f != null) 
     .ToList(); 

    if (failures.Any()) 
    { 
     var response = new Thing(); //obviously a type conforming to TResponse 
     response.Failures = failures; //I'm making an assumption on the property name here. 

     return Task.FromResult(response); 
    } 
    else 
    { 
     return next(); 
    } 
} 

Note:
Votre classe (Thing dans mon exemple) doit être de type TResponse

+0

Bonjour, je vais répondre à votre question ci-dessus. Mon apparence de classe de réponse comme ceci: 'public class ResponseBase: ValidationResult { ResponseBase public(): base() {} ResponseBase publique (IEnumerable échecs ): base (échecs) { } } ' J'ai fait ceci, mais j'ai eu l'erreur quand essaye de convertir ResponseBase en TResponse var response = new ResponseBase (échecs); return Task.FromResult (réponse); – anggiputper

+0

s'il vous plaît modifier votre question pour inclure le code formaté – Alex

+0

Je travaille dessus, encore du mal avec le formatage, désolé: / – anggiputper