Mediatr хендлеры, они одиночки? - PullRequest
0 голосов
/ 25 февраля 2020

Я использую Mediatr в своем. Net Базовом проекте, и мне было интересно, являются ли обработчики в Mediatr синглтонами или являются новыми экземплярами для каждого запроса на отправку; Я знаю, что Mediatr - это синглтон, но для обработчиков, которые он использует для команды или запроса, я не очень уверен.

Я склонен думать, что они также будут одиночными; но просто хотел подтвердить дважды.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

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

services.AddScoped<IPipelineBehavior<MyCommand>, MyHandler>();

На самом деле мы оборачиваем Mediatr, чтобы мы могли добавлять различные биты и бобы, чтобы в итоге это было расширение регистрации, как это (CommandContect / QueryContext содержит различные вещи, которые мы используем все время, а ExecutionResponse - это стандартный ответ, поэтому у нас могут быть стандартные post обработчики, которые знают, что они получают):

public static IServiceCollection AddCommandHandler<THandler, TCommand>(this IServiceCollection services)
            where THandler : class, IPipelineBehavior<CommandContext<TCommand>, ExecutionResponse>
            where TCommand : ICommand
        {
            services.AddScoped<IPipelineBehavior<CommandContext<TCommand>, ExecutionResponse>, THandler>();
            return services;
        }

, который используется так:

services.AddCommandHandler<MyHandler, MyCommand>();

У нас есть аналогично для запросов (AddQueryHandler <.....) </p>

Надеюсь, это поможет

0 голосов
/ 25 февраля 2020

Для обработчиков, после следования исходному коду, похоже, что они все добавлены как Transient.

https://github.com/jbogard/MediatR.Extensions.Microsoft.DependencyInjection/blob/1519a1048afa585f5c6aef6dbdad7e9459d5a7aa/src/MediatR.Extensions.Microsoft.DependencyInjection/Registration/ServiceRegistrar.cs#L57

services.AddTransient(@interface, type);

Для самого IMediator он также выглядит переходным по умолчанию:

https://github.com/jbogard/MediatR.Extensions.Microsoft.DependencyInjection/blob/1519a1048afa585f5c6aef6dbdad7e9459d5a7aa/src/MediatR.Extensions.Microsoft.DependencyInjection/Registration/ServiceRegistrar.cs#L223

services.Add(new ServiceDescriptor(typeof(IMediator), serviceConfiguration.MediatorImplementationType, serviceConfiguration.Lifetime));

Обратите внимание, что конфигурация службы - это объект конфигурации, который, если вы каким-либо образом не измените его по пути по умолчанию, также будет установлен как переходный:

public MediatRServiceConfiguration()
{
    MediatorImplementationType = typeof(Mediator);
    Lifetime = ServiceLifetime.Transient;
}
...