我想找到一个关于如何实现这个示例业务工作流的好的设计模式。与其使用一个巨大的、类似程序的方法调用,我想我想使用流畅的方法链——基本上,一个简单的工作流管道,不使用这些工作流或 BPM 框架之一。关于最佳实践的建议,也许是已知的设计模式?
我的例子
输入/用户偏好会导致很多 if/else 逻辑,所以我不想让我的方法必须包含我所有的 if/else 逻辑来查看每个步骤是否成功,并处理。 (即我不想要)
myOutput1 = CallMethod1(param1, param2, our errorMsg)
if (error)
{ // do something, then break }
myOutput2 = CallMethod2(param1, param2, our errorMsg)
if (error)
{ // do something, then break }
...
myOutput9 = CallMethod9(param1, param2, our errorMsg)
if (error)
{ // do something, then break }
示例创意管道代码
也许像这样?它会起作用吗?我怎样才能改进它?
public class Reporter
{
private ReportSettings Settings {get; set;}
private ReportResponse Response {get; set;}
public ReportResponse GenerateAndSendReports(string groupName)
{
ReportResponse response = this.GetInputConfiguration()
.ValidateConfiguration()
.StandardizeConfiguration(groupName)
.PopulateReport1()
.PopulateReport2()
.PopulateReport99()
.EmailReports()
.Output();
return response;
}
public Reporter GetInputConfiguration()
{
this.Response = new ReportResponse();
this.Settings = new ReportSetting();
this.Settings.IsReport1Enabled = ConfigurationManager.GetSetting("EnableReport1");
this.Settings.Blah1 = ConfigurationManager.GetSetting("Blah1");
this.Settings.Blah2 = ConfigurationManager.GetSetting("Blah2");
return this;
}
public Reporter StandardizeConfiguration(string groupName)
{
this.Settings.Emails = myDataService.GetEmails(groupName);
return this;
}
public Reporter PopulateReport1()
{
if (!this.Setting.HasError && this.Settings.IsReport1Enabled)
{
try
{
this.Response.Report1Content = myReportService.GetReport1(this.Settings.Blah1, this.Blah2)
}
catch (Exception ex)
{
this.Response.HasError = true;
this.Response.Message = ex.ToString();
}
}
return this;
}
}
我在想这样的事情
最佳答案
您提到了两个不同的概念:流利机制和管道(或责任链)模式。
管道模式
IPipeline
其中包含 DoThings();
. IPipeline
的实现必须包含 IPipeline GetNext();
流利
IFluent
. IValidatedData
可能暴露IStandardizedData Standardize()
, 和 IStandardizedData
可能暴露IStandardizedData PopulateReport(var param)
和 IStandardizedData PopulateEmail(var param)
.这就是 LINQ 对枚举、列表等所做的。但是,在您的示例中,您似乎主要是在寻找 Fluent 机制。管道模式有助于数据流(例如 HTTP 请求处理程序)。在您的情况下,您只是将属性应用于单个对象
Reporter
,所以管道模式并不真正适用。对于那些因为正在寻找双向(推拉)流畅管道而到此结束的人,您希望通过返回
IPipelineStep
以流畅的操作来构建管道。 .管道的行为由每个 IPipelineStep
的实现定义.您可以通过以下方式实现此目的:
PipelineStep
工具IPipelineStep
PipelineStep
包含 private IPipelineStep NextStep(get;set);
IPipelineBuilder
包含可用于构建管道的流畅操作。 IPipelineStep
的凝结物。和 IPipelineBuilder
. this.NextStep
. IPipelineStep
包含 var Push(var input);
和 var Pull(var input);
Push
做事然后打电话this.NextStep.Push
Pull
电话this.NextStep.Pull
然后做事返回您还需要考虑在构建后如何使用管道:从上到下或相反。
关于c# - 如何实现一个简单的工作流管道流畅的api方法链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41224894/