c# - 如何实现一个简单的工作流管道流畅的api方法链?

标签 c# workflow fluent method-chaining

我想找到一个关于如何实现这个示例业务工作流的好的设计模式。与其使用一个巨大的、类似程序的方法调用,我想我想使用流畅的方法链——基本上,一个简单的工作流管道,不使用这些工作流或 BPM 框架之一。关于最佳实践的建议,也许是已知的设计模式?

我的例子

  • 获取配置/用户首选项
  • 验证配置/首选项
  • 查找/标准化附加配置/首选项
  • 获取报告 1(使用以上输入)
  • 获取报告 2 等
  • 电子邮件报告

  • 输入/用户偏好会导致很多 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;
    }
    }
    

    我在想这样的事情

    最佳答案

    您提到了两个不同的概念:流利机制和管道(或责任链)模式。
    管道模式

  • 必须定义一个接口(interface) IPipeline其中包含 DoThings(); .
  • IPipeline 的实现必须包含 IPipeline GetNext();

  • 流利
  • 所有 Action 都必须返回对被 Action 修改的对象的引用:IFluent .
  • 如果您想更好地控制哪些选项可用以及何时在您的工作流程中可用,您可以让 Fluent 操作返回不同的界面:例如 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 .
  • 返回前,流畅 Action 更新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/

    相关文章:

    c# - WCF SOAP 服务在(反)序列化时更改数组项元素的名称

    c# - Entity Framework - CF/FA - 在 POCO 中定义过滤的导航属性

    design-patterns - 围绕用户工作流程构建 Web 应用程序

    java - jit会优化新对象吗

    string - 创建字符串并将其用作输出文件的名称

    c# - 将 Bot 框架与 LUIS 连接。我应该使用哪个 AppId 和 AppKey?

    c# - UWP - 检查表是否存在

    c# - 从DataTable中删除具有相同列值的行并添加相应的值

    c++ - git 和 C++ 工作流程,如何处理对象和归档文件?

    database - 如果你这样做的话,在生产服务器上更改代码是邪恶的 : But what's the best way to handle it, 吗?