ASP.NET Core、組み込みコンテナー、および "behavior" pipelines をサポートするMediatR 3を使用しています。
public class MyRequest : IRequest<string>
{
// ...
}
public class MyRequestHandler : IRequestHandler<MyRequest, string>
{
public string Handle(MyRequest message)
{
return "Hello!";
}
}
public class MyPipeline<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next)
{
var response = await next();
return response;
}
}
// in `Startup.ConfigureServices()`:
services.AddTransient(typeof(IPipelineBehavior<MyRequest,string>), typeof(MyPipeline<MyRequest,string>))
パイプラインにFluentValidationバリデーターが必要です。 MediatR 2では、 検証パイプラインがこうして作成されました :
public class ValidationPipeline<TRequest, TResponse>
: IRequestHandler<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
public ValidationPipeline(IRequestHandler<TRequest, TResponse> inner, IEnumerable<IValidator<TRequest>> validators)
{
_inner = inner;
_validators = validators;
}
public TResponse Handle(TRequest message)
{
var failures = _validators
.Select(v => v.Validate(message))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
if (failures.Any())
throw new ValidationException(failures);
return _inner.Handle(request);
}
}
新しいバージョンでこれを行うにはどうすればよいですか?使用するバリデータを設定するにはどうすればよいですか?
プロセスはまったく同じです。新しいIPipelineBehavior<TRequest, TResponse>
インターフェイスを使用するには、インターフェイスを変更するだけです。
public class ValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
where TRequest : IRequest<TResponse>
{
private readonly IEnumerable<IValidator<TRequest>> _validators;
public ValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
{
_validators = validators;
}
public Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next)
{
var context = new ValidationContext(request);
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
if (failures.Count != 0)
{
throw new ValidationException(failures);
}
return next();
}
}
バリデーターについては、すべてのバリデーターをIValidator<TRequest>
としてビルトインコンテナーに登録して、ビヘイビアーにインジェクトされるようにする必要があります。それらを1つずつ登録したくない場合は、アセンブリスキャン機能をもたらすすばらしい Scrutorライブラリ をご覧になることをお勧めします。これにより、バリデータ自体が検索されます。
また、新しいシステムでは、デコレータパターンを使用せず、汎用的な動作をコンテナに登録するだけで、MediatRはそれを自動的に取得します。次のようになります。
var services = new ServiceCollection();
services.AddMediatR(typeof(Program));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>));
var provider = services.BuildServiceProvider();
.netコア統合をnugetにパックしました。気軽に使用してください: https://www.nuget.org/packages/MediatR.Extensions.FluentValidation.AspNetCore
構成セクションに挿入するだけです:
services.AddFluentValidation(new[] {typeof(GenerateInvoiceHandler).GetTypeInfo().Assembly});