使用ASP.NET Core DI的MediatR

Nye*_*ard 17 c# asp.net mediatr asp.net-core

我正在使用新的ASP.NET Core,目前正在创建一个我想从JavaScript前端调用的API.

我想使用中介模式来减少耦合,我找到了Jimmy Bogard 的Library MediatR.

我的问题在于使用DI中的内置进行连接,我已经尝试查看这些示例,但是无法看到它如何绑定到启动类中的ConfigureServices方法.

有人有任何见解吗?

更新:我从我的ConfigureService方法得到了它:

services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t));

services.Scan(scan => scan
        .FromAssembliesOf(typeof(IMediator), typeof(MyHandler.Handler))
        .AddClasses()
        .AsImplementedInterfaces());
Run Code Online (Sandbox Code Playgroud)

dmc*_*gin 30

截至2016年7月,MediatR的作者Jimmy Bogard发布了一个软件包,用于注册MediatR和Handlers,以及ASP.Net Core DI服务(实际上是接口IServiceCollection,实现在Microsoft.Extensions.DependencyInjectionASP 中,并且不限于仅在ASP中使用) .Net核心).

MediatR.Extensions.Microsoft.DependencyInjection

链接到GitHub项目.

链接到NuGet包信息.

可以在此处找到介绍该软件包及其功能的博客文章

直接从(非常短的)博客文章中复制的示例注册:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc();

  services.AddMediatR(typeof(Startup));
}
Run Code Online (Sandbox Code Playgroud)

该软件包执行多个功能来启用MediatR,包括处理程序所需的扫描程序集:

您可以传入处理程序所在的程序集,也可以从这些处理程序所在的程序集中传入Type对象.该扩展将IMediator接口添加到您的服务,所有处理程序和正确的委托工厂以加载处理程序.然后在您的控制器中,您可以使用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);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确的答案.它不仅更优雅,更简单,而且是Mediatr创建者推荐的. (3认同)
  • 似乎从 MediatR v12 开始,`MediatR.Extensions.Microsoft.DependencyInjection` 已被弃用 (2认同)

小智 6

https://dotnetcoretutorials.com/有\xc2\xb4s 一个很好的教程。这是正确安装和配置 MediatR 的示例代码。

\n\n

安装 MediatR

\n\n

我们需要做的第一件事是安装 MediatR nuget 包。因此,从您的包管理器控制台运行:

\n\n

安装包 MediatR

\n\n

我们还需要安装一个包,允许我们使用 .NET Core 中内置的 IOC 容器来发挥我们的优势(我们\xe2\x80\x99很快就会看到更多内容)。因此还要安装以下软件包:

\n\n

安装包 MediatR.Extensions.Microsoft.DependencyInjection

\n\n

最后我们打开startup.cs 文件。在我们的ConfigureServices方法中,我们需要添加一个调用来注册所有MediatR\xe2\x80\x99s依赖项。

\n\n
public void ConfigureServices(IServiceCollection services)\n{\n    services.AddMediatR(Assembly.GetExecutingAssembly());\n    //Other injected services. \n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是链接:https://dotnetcoretutorials.com/2019/04/30/the-mediator-pattern-part-3-mediatr-library/

\n\n

我希望这有帮助。

\n


Des*_*eiL 5

根据 MediatR 文档注册 MediatR 服务和所有处理程序,您应该以这种方式使用 AddMediatR 方法:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc();

  services.AddMediatR(typeof(Startup));
}
Run Code Online (Sandbox Code Playgroud)

这很简单,也很舒服,但如果您想更换其中一名处理程序怎么办?然后,您应该在您的一个 .cs 文件中找到 old 并从中删除接口,这样多个实现的 ID 就不会发生冲突。

为了避免这种情况,我的建议是手动注册每个处理程序

     public void ConfigureServices(IServiceCollection services)
    {
      services.AddMvc();
    
      services.AddMediatR(typeof(Mediator)); //registering MediatR and all required dependencies
      //registering handlers
      services.AddScoped<IRequestHandler<CreateProductCommand, int>,CreateProductCommandHandler>(); 
      services.AddScoped<IRequestHandler<DeleteProductCommand, int>,DeleteProductCommandHandler>();     

    }
Run Code Online (Sandbox Code Playgroud)

该解决方案允许您对同一命令进行多重处理程序实现,并提供对使用的女巫实现的控制