针对最新的 MediatR 版本 12.x,发布于2023年2月:
从版本12开始,Mediatr提供了直接在Mediatr命名空间中使用Microsoft依赖注入框架注册处理程序的支持,因此可以通过在服务集合上调用AddMediatR
来实现。
services.AddMediatR(cfg =>
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly));
Ping
是一种类型,包含在应该扫描以注册处理程序等的程序集中。
注意:以前版本的 MediatR 中创建的支持此注册的其他 NuGet 包(如下所述)不再需要;有关此更改和其他重大更改的详细信息,请参见 GitHub 上的 迁移指南:
对于早期的 Mediatr 版本,包括 11.x:
2016 年 7 月,MediatR 的作者 Jimmy Bogard 发布了一个包,用于将 MediatR 和处理程序与 ASP.Net Core DI 服务(实际上是接口 IServiceCollection
,实现在 Microsoft.Extensions.DependencyInjection
中,并不限于仅在 ASP.Net Core 中使用)注册。
MediatR.Extensions.Microsoft.DependencyInjection
GitHub项目链接。
NuGet包信息链接。
介绍该包及其功能的博客文章可以在这里找到。
以下是从(非常简短的)博客文章中直接复制的示例注册:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddMediatR(typeof(Startup));
}
这个包执行几个功能,以使MediatR能够正常工作,其中包括对处理程序进行必要的程序集扫描:
您可以传递处理程序所在的程序集,也可以传递来自包含这些处理程序的程序集的Type对象。扩展将向您的服务添加IMediator接口、所有处理程序和正确的委托工厂以加载处理程序。
注意:从Mediatr版本12开始,不再需要此软件包。
对于所有版本
一旦使用上述描述的相关方法指定了依赖项注册,则在控制器中,您只需使用IMediator依赖项即可:
public class HomeController : Controller
{
private readonly IMediator _mediator;
public HomeController(IMediator mediator)
{
_mediator = mediator;
}
public IActionResult Index()
{
var pong = _mediator.Send(new Ping {Value = "Ping"});
return View(pong);
}
}
services.AddTransient(typeof (IMediator), BuildMediator().GetType());
- Nyegaardservices.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t));
和services.AddScoped<MultiInstanceFactory>(p => t => p.GetRequiredServices(t));
是工厂方法,注入到中介器中并解析通知(多)或请求(单)。 - TsengIMediator
本身可以注册为services.AddScoped<IMediator, Mediator>()
,因为它具有公共构造函数,而委托在前一步中已注册。在示例中,最后一个步骤是通过 Scrutor 扫描自动执行的。 - Tseng