【问题标题】:How to offer (optional) notification handlers in MediatR如何在 MediatR 中提供(可选)通知处理程序
【发布时间】:2020-01-31 22:08:00
【问题描述】:

我在控制台应用程序中使用 Jimmy Bogard 的 MediatR 库来调用各种 SOAP 端点。该应用程序通过几个IRequestHandler<T1, T2> 实现的魔力进行了出色的配置和运行。

但是,在我的所有命令行实用程序调用中,有 2 个标志允许用户将 Xml 响应(以及其他详细信息)保存到数据库表和/或保存文本文件。我觉得这对于INotificationHandler<T> 来说是一个很好的机会,但我似乎无法完全理解工作流程。

据我了解,一旦通过 IoC 注册,他们就会一直在倾听。但是,(在我的情况下)它们将根据命令行标志动态设置。

public class SoapRequest : IRequest<string>
{
   // lots of properties here...

   public bool SkipDatabase { get; set; }
   public string OutputFile { get; set; }
}

// in my handler
public class SoapRequestHandler : IRequestHandler<SoapRequest, string>
{

   public async Task<string> Handler(SoapRequest request, CancellationToken token)
   {
      // fetches soap data, and does other stuff here... 
      var responseXml = await _endPoint.DoStuff(request.Prop1, ...);

      if (!request.SkipDatabase)
      {
         var dbCommand = new DatabaseCommand 
         { 
            ResponseString = responseXml, 
            ... 
         };

         await _mediator.Send(dbCommand, token);
      }

      if (!string.IsNullOrEmpty(request.OutputFile))
      {
         var fileCommand = new XmlFileCommand 
         { 
            FileName = request.OutputFile, 
            Xml = responseXml, 
            ... 
         };

         await _mediator.Send(fileCommand, token);
      }

      return responseXml;
   }
}

考虑以下几点:

这会将结果保存到数据库表中

> myapp fetch_users 

这会将结果写入文本文件,并且保存到数据库中

> myapp fetch_users --output-file="c:\temp\users.xml" --skip-db

我目前正在使用 2 个单独的 IRequest 命令/处理程序来管理它,并且它开始散发出代码气味。我的一些低级处理程序在不适用的请求对象上公开了更高级别的属性。我想使用通知处理程序来解决这个问题,但只能按需注册,具体取决于用户 CLI 标志。

由于在启动时在 IoC 中配置了 MediatR,这对我来说是个问题。我担心的是,如果我注册了两个通知处理程序(DatabaseNotificationHandlerFileSystemNotificationHandler),它们将一直在监听,如果不将标志传递给我最深的处理程序,我无法弄清楚如何动态地将标志放入处理程序。有没有更好的办法?

#WWJBD - Jimmy Bogard 会做什么? :)

【问题讨论】:

  • 很抱歉,我对MediatR 一无所知,所以我真的不知道有什么可能。但是,你能不能……在配置你的 IoC 容器时不注册处理程序?就像,大概你在Program.Main 中这样做。那么,您可以在那里阅读命令行参数,然后根据参数注册您的INotificationHandler&lt;&gt; 还是不注册?
  • 感谢您的回复。我实际上是在寻找一种在 IoC 之外执行此操作的方法,因为属性可以在更高级别的处理程序中动态更改。有关工作流程将如何进行的更多信息,我已在此处将我的问题(带有伪代码)发布到 MediatR 问题:github.com/jbogard/MediatR/issues/490#issuecomment-581172657

标签: c# console-application mediatr


【解决方案1】:

此问题已在jbogard/MediatR Github Issues 中解决。

解决方案是嵌套多个MediatR.Send(...) 调用,甚至使用MediatR.Publish(...),而是在我的主处理程序中将我的代码重构为正确的业务逻辑。我的soap 请求具有转换为域类型的所需属性,然后我使用这些属性来确定每个soap 调用的工作方式(即数据库捕获和Xml 文件序列化)。

感谢@lilasquared 的提示。

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 2020-12-08
    • 2023-02-20
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    相关资源
    最近更新 更多