gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:04:18 27 4
gpt4 key购买 nike

我想找到一个关于如何实现这个示例业务工作流的好的设计模式。与其使用一个巨大的、类似程序的方法调用,我想我想使用流畅的方法链——基本上,一个简单的工作流管道,不使用这些工作流或 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/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com