在MediatR中,IRequest
始终仅由单个IRequestHandler
处理。
让我们假设,一个意外地针对相同的请求类型(PingHandler
和PingHandler2
)实现了两个具体的实现。在这种情况下,MediatR仅将请求分派到最后注册的处理程序(因为它使用了StructureMap / Lamar中的GetInstance())。
第一个请求处理程序被静默忽略。
是否有机会检测到这种错误?
using Lamar;
using MediatR;
using System;
using System.Threading;
namespace DDDTest
{
class Program
{
static void Main(string[] args)
{
var container = new Container(c =>
{
c.For<IMediator>().Use<Mediator>();
c.For<ServiceFactory>().Use(ctx => ctx.GetInstance);
// Alternative 1: Scanning
c.Scan(s =>
{
s.TheCallingAssembly();
s.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
});
// Alternative 2: Direct registration, same effect
//c.For<IRequestHandler<Ping>>().Use<PingHandler>();
//c.For<IRequestHandler<Ping>>().Use<PingHandler2>();
});
var mediator = container.GetInstance<IMediator>();
mediator.Send(new Ping());
Console.ReadKey();
}
}
public class Ping : IRequest
{
}
public class PingHandler : RequestHandler<Ping>
{
protected override void Handle(Ping notification)
{
Console.WriteLine($"Pong from {Thread.CurrentThread.ManagedThreadId}");
}
}
public class PingHandler2 : RequestHandler<Ping>
{
protected override void Handle(Ping notification)
{
Console.WriteLine($"Pong2 from {Thread.CurrentThread.ManagedThreadId}");
}
}
}
为了澄清:我不希望调用多个请求处理程序,我只是想检测例如另一个开发人员是否意外创建了另一个处理程序并覆盖了原始处理程序。