我正在使用ASP.NET Core,最新的MediatR和MediatR扩展Core的DI.
我正在尝试设置通过验证的管道使用官方博客文章中的示例 。此处有示例代码。
我不明白如何注册/使用该管道类。另一篇博客文章展示了如何在AutoFac上完成此操作。
我该如何在内置容器中完成此操作?
我正在使用ASP.NET Core,最新的MediatR和MediatR扩展Core的DI.
我正在尝试设置通过验证的管道使用官方博客文章中的示例 。此处有示例代码。
我不明白如何注册/使用该管道类。另一篇博客文章展示了如何在AutoFac上完成此操作。
我该如何在内置容器中完成此操作?
你提到的帖子使用的是MediatR 2.x版本。
不久前发布了MediatR 3.0,内置了对管道的支持。建议您阅读相关文档。
简而言之,MediatR现在公开了一个IPipelineBehavior<TRequest, TResponse>
,您在容器中注册的实例将被MediatR自动发现并构建处理程序。
以下是在ASP.NET Core中可能看起来像什么:
public class MyRequest : IRequest<string>
{
}
public class MyRequestHandler : IRequestHandler<MyRequest, string>
{
public string Handle(MyRequest message)
{
return "Hello!";
}
}
public class TracingBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse>
{
public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next)
{
Trace.WriteLine("Before");
var response = await next();
Trace.WriteLine("After");
return response;
}
}
非常简单,一个请求,一个处理程序和一个执行某些“日志记录”操作的行为。
注册也非常容易:
var services = new ServiceCollection();
services.AddMediatR(typeof(Program));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(TracingBehaviour<,>));
var provider = services.BuildServiceProvider();
var mediator = provider.GetRequiredService<IMediator>();
var response = await mediator.Send(new MyRequest());
只需要将开放式泛型 TracingBehavior
注册为 IPipelineBehavior
的通用实现即可。
IPipelineBehavior
实例并创建一个管道,其中所有行为都被链接在一起,链中的最后一个元素是实际的处理程序。如果您有兴趣阅读代码,这一切都发生在RequestHandlerImpl<TRequest, TResponse>
类中。 - Mickaël Derrieyservices.AddTransient(typeof(IPipelineBehavior<MyRequest, string>), typeof(TracingBehaviour<MyRequest, string>));
的意思是将TracingBehaviour<MyRequest, string>
注册为IPipelineBehavior<MyRequest, string>
的一个瞬态服务。 - grokky