Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MediatR中提供(可选)通知处理程序_C#_Console Application_Mediatr - Fatal编程技术网

C# 如何在MediatR中提供(可选)通知处理程序

C# 如何在MediatR中提供(可选)通知处理程序,c#,console-application,mediatr,C#,Console Application,Mediatr,我在控制台应用程序中使用Jimmy Bogard的库来调用各种SOAP端点。通过几个IRequestHandler实现的魔力,该应用程序的配置和运行都非常出色 但是,在我所有的命令行实用程序调用中,有两个标志允许用户将Xml响应(以及其他详细信息)保存到数据库表和/或保存文本文件。我觉得这对于一个INotificationHandler来说是一个很好的机会,但我似乎无法对工作流保持清醒的头脑 我的理解是,一旦通过国际奥委会注册,他们总是在倾听。但是,(在我的例子中)它们将根据命令行标志进行动态设

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

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

我的理解是,一旦通过国际奥委会注册,他们总是在倾听。但是,(在我的例子中)它们将根据命令行标志进行动态设置

公共类SoapRequest:IRequest
{
//这里有很多房产。。。
公共bool SkipDatabase{get;set;}
公共字符串输出文件{get;set;}
}
//在我的处理程序中
公共类SoapRequestHandler:IRequestHandler
{
公共异步任务处理程序(SoapRequest请求、CancellationToken令牌)
{
//获取soap数据,并在此处执行其他操作。。。
var responseXml=wait_endPoint.DoStuff(request.Prop1,…);
如果(!request.SkipDatabase)
{
var dbCommand=新数据库命令
{ 
ResponseString=responseXml,
... 
};
wait_mediator.Send(dbCommand,token);
}
如果(!string.IsNullOrEmpty(request.OutputFile))
{
var fileCommand=新的XmlFileCommand
{ 
FileName=request.OutputFile,
Xml=responseXml,
... 
};
wait_mediator.Send(fileCommand,token);
}
返回响应xml;
}
}
考虑以下事项: 这将把结果保存到数据库表中

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

我目前使用两个独立的
IRequest
命令/处理程序来管理它,它开始散发出代码的味道。我的一些低级处理程序公开了不适用的请求对象的高级属性。我想使用通知处理程序来解决这个问题,但只能根据用户的CLI标志按需注册

由于MediatR在启动时在IoC中配置,这给我带来了一个问题。我担心的是,如果我注册两个通知处理程序(
DatabaseNotificationHandler
FileSystemNotificationHandler
),它们将始终在侦听,并且我不知道如何在不将标志传递给最深的处理程序的情况下将其动态地放入处理程序。有更好的办法吗

#WWJBD
-吉米·博加德会怎么做?:)

这个问题在年解决了

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


谢谢@lilasquared的提示。

对不起,我对
MediatR
一无所知,所以我真的不知道有什么可能。但是,你能不能。。。配置IoC容器时不注册处理程序?比如,你大概是在
Program.Main
中这样做的。那么,您是否可以读取那里的命令行参数,然后注册您的
INotificationHandler
,或者不基于这些参数?谢谢您的回复。实际上,我正在寻找一种在IoC之外实现这一点的方法,因为属性可以在更高级别的处理程序中动态更改。有关工作流将如何运行的更多信息,我已将我的问题(带有伪代码)发布到MediatR问题:
> myapp fetch_users 
> myapp fetch_users --output-file="c:\temp\users.xml" --skip-db