Mediatr 处理程序是单例吗?

Dhi*_*iru 8 .net-core mediatr

我在 .Net Core 项目中使用 Mediatr,我想知道 Mediatr 中的处理程序是单例还是每个发送请求的新实例;我知道 Mediatr 是单例,但对于它用于命令或查询的处理程序,我不太确定。

我倾向于认为他们也会是单身人士;但只是想再次确认。

Dan*_*kov 6

事实上,所有这些东西的生命周期都有详细记录 https://github.com/jbogard/MediatR.Extensions.Microsoft.DependencyInjection/blob/master/README.md

仅供参考: IMediator 是瞬态的(不是单例), IRequestHandler<> 具体实现是瞬态的等等,所以实际上它在任何地方都是瞬态的。

但请注意将 Scoped 服务与 Mediatr 处理程序一起使用,它不会按预期工作,更像单例,除非您手动创建范围。


Min*_*ata 5

对于处理程序,按照源代码进行操作后,看起来它们都被添加为 Transient。

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

services.AddTransient(@interface, type);
Run Code Online (Sandbox Code Playgroud)

对于 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));
Run Code Online (Sandbox Code Playgroud)

请注意,服务配置是一个配置对象,除非您以某种方式沿其默认路径更改它,否则它也将被设置为瞬态:

public MediatRServiceConfiguration()
{
    MediatorImplementationType = typeof(Mediator);
    Lifetime = ServiceLifetime.Transient;
}
Run Code Online (Sandbox Code Playgroud)