【发布时间】: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,这对我来说是个问题。我担心的是,如果我注册了两个通知处理程序(DatabaseNotificationHandler 和FileSystemNotificationHandler),它们将一直在监听,如果不将标志传递给我最深的处理程序,我无法弄清楚如何动态地将标志放入处理程序。有没有更好的办法?
#WWJBD - Jimmy Bogard 会做什么? :)
【问题讨论】:
-
很抱歉,我对
MediatR一无所知,所以我真的不知道有什么可能。但是,你能不能……在配置你的 IoC 容器时不注册处理程序?就像,大概你在Program.Main中这样做。那么,您可以在那里阅读命令行参数,然后根据参数注册您的INotificationHandler<>还是不注册? -
感谢您的回复。我实际上是在寻找一种在 IoC 之外执行此操作的方法,因为属性可以在更高级别的处理程序中动态更改。有关工作流程将如何进行的更多信息,我已在此处将我的问题(带有伪代码)发布到 MediatR 问题:github.com/jbogard/MediatR/issues/490#issuecomment-581172657
标签: c# console-application mediatr