29

我正在使用新的 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());
4

5 回答 5

53

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

MediatR.Extensions.Microsoft.DependencyInjection

链接到 GitHub 项目

链接到 NuGet 包信息

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

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

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

  services.AddMediatR(typeof(Startup));
}

此包执行多项功能以启用 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);
  }
}
于 2016-09-17T22:56:10.140 回答
5

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

安装 MediatR

我们需要做的第一件事是安装 MediatR nuget 包。所以从你的包管理器控制台运行:

安装包 MediatR

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

安装包 MediatR.Extensions.Microsoft.DependencyInjection

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddMediatR(Assembly.GetExecutingAssembly());
    //Other injected services. 
}

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

我希望这有帮助。

于 2019-11-25T15:44:27.930 回答
4

我让它工作,我的代码:

public void ConfigureServices(IServiceCollection services)
{
      services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t));
      services.AddScoped<MultiInstanceFactory>(p => t => p.GetRequiredServices(t));
      services.Scan(scan => scan
              .FromAssembliesOf(typeof(IMediator), typeof(MyHandlerOne.Handler))
              .FromAssembliesOf(typeof(IMediator), typeof(MyHandlerTwo.Handler))
             .AddClasses()
             .AsImplementedInterfaces());
}

我有一个实现 MultiInstanceFactory 需要的 GetRequiredService 的类:

public static class GetServices
{
    public static IEnumerable<object> GetRequiredServices(this IServiceProvider provider, Type serviceType)
    {
        return (IEnumerable<object>)provider.GetRequiredService(typeof(IEnumerable<>).MakeGenericType(serviceType));
    }
}
于 2016-02-15T13:56:59.360 回答
0

为 ASP.NET Core RC2 创建了一个 DI 帮助程序,您可以将其添加到您的启动中。它为您提供了基于基本约定的映射,因此,如果您有这样的类:

MyClass : IMyClass

它将映射IMyClass到 IOC 容器中,使其可用于注入。

我还添加了 MediatR 的映射。

使用它只需将类添加到您的项目中,然后在您的 startup.cs 类中添加您需要的行到ConfigureServices()方法中:

public void ConfigureServices(IServiceCollection services)
{
    //Other Code here......

    var ioc = new PearIoc(services);

    //ioc.AddTransient<IEmailSender, AuthMessageSender>();
    //ioc.AddTransient<ISmsSender, AuthMessageSender>();

    ioc.WithStandardConvention();
    ioc.WithMediatR();
    ioc.RunConfigurations();
}

我添加该AddTransient()方法只是为了方便(您也可以只使用services.AddTransient()),但它也暴露了IServiceCollection您需要使用它做更多事情的情况。

您也可以像我对扩展所做的那样扩展它.WithMediatR()并编写您自己的自定义映射。

于 2016-06-07T17:28:02.997 回答
0

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

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

  services.AddMediatR(typeof(Startup));
}

这很简单,很舒服,但是如果你想更换其中一个处理程序怎么办?然后你应该找到 oldhandler.cs 并从中删除接口,这样一个以上的实现就不会有 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>();     

    }

此解决方案允许您为同一命令执行多个处理程序实现,并控制使用女巫实现

于 2022-02-14T09:11:54.087 回答