В MediatR IRequest
всегда обрабатывается только одним IRequestHandler
.
Предположим, одна случайно реализовала две конкретные реализации для одного и того же типа запроса (PingHandler
и PingHandler2
),В этом случае MediatR отправляет запрос только последнему зарегистрированному обработчику (поскольку он использует GetInstance () из StructureMap / Lamar).
Первый обработчик запроса игнорируется.
Есть лишанс обнаружить этот тип ошибки?
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}");
}
}
}
Чтобы уточнить: я не хочу вызывать несколько обработчиков запросов, я просто хочу обнаружить, если, например, другой разработчик случайно создал другой обработчик и переопределяет исходный обработчик.