Обнаружить несколько конкретных реализаций для запроса - PullRequest
0 голосов
/ 01 декабря 2018

В 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}");
        }
    }
}

Чтобы уточнить: я не хочу вызывать несколько обработчиков запросов, я просто хочу обнаружить, если, например, другой разработчик случайно создал другой обработчик и переопределяет исходный обработчик.

...