代码之家  ›  专栏  ›  技术社区  ›  Erik Forbes

这是工作流式系统的良好设计吗?

  •  5
  • Erik Forbes  · 技术社区  · 16 年前

    我正在设计一个系统,它允许我将广泛的任务表示为工作流,通过IEnumerable方法公开它们的工作项。这里的目的是使用C的“yield”机制来允许我编写psuedo过程代码,工作流执行系统可以根据需要执行这些代码。

    例如,假设我有一个工作流,其中包括在数据库上运行查询,并在查询返回某个结果时发送电子邮件警报。这可能是工作流:

    public override IEnumerable<WorkItem> Workflow() {
        // These would probably be injected from elsewhere
        var db = new DB();
        var emailServer = new EmailServer();
    
        // other workitems here
    
        var ci = new FindLowInventoryItems(db);
        yield return ci;
    
        if (ci.LowInventoryItems.Any()) {
            var email = new SendEmailToWarehouse("Inventory is low.", ci.LowInventoryItems);
            yield return email;
        }
    
        // other workitems here
    }
    

    checkinventory和emailwarehouse是从WorkItem派生的对象,WorkItem具有子类实现的抽象execute()方法,封装了这些操作的行为。在工作流框架中调用execute()方法-我有一个WorkflowRunner类,它枚举工作流(),在工作项周围包装前后事件,并在事件之间调用execute。这允许使用应用程序在工作项之前或之后执行所需的任何操作,包括取消、更改工作项属性等。

    我认为,所有这些的好处在于,我可以用负责完成工作的工作项来表达任务的核心逻辑,并且我可以以一种相当简单、几乎是程序化的方式来完成工作。另外,因为我使用的是IEnumerable和支持它的C语法糖,所以我可以组合这些工作流,比如使用和操作子工作流的高级工作流。例如,我编写了一个简单的工作流,它只是将两个子工作流交错在一起。

    我的问题是,这类架构是否合理,特别是从可维护性的角度来看?对于我来说,它似乎实现了几个目标——自我记录代码(工作流按程序读取,所以我知道什么将按什么步骤执行)、关注点分离(查找低库存项目不依赖于向仓库发送电子邮件)等等——我没有看到这种架构有什么潜在的问题吗?最后,这个以前试过吗-我只是在重新发现这个吗?

    2 回复  |  直到 16 年前
        1
  •  2
  •   duffymo    16 年前

    就我个人而言,这将是一个“先买后建”的决定。我会先买点东西再写。

    我在一家相当大的公司工作,并且可能会对它的钱感到愚蠢,所以如果你是为自己写这篇文章,并且不能买东西,我会收回你的评论。

    以下是一些随机的想法:

    我将把工作流具体化为一种配置,可以在启动时从文件或数据库中读取。

    它看起来像一个有限状态机,具有状态、转换、事件和动作。

    我希望能够插入不同的操作,这样我就可以动态地定制不同的流。

    我希望能够注册不同的订户,他们希望在特定事件发生时得到通知。

    我不希望看到像那个电子邮件服务器那样的硬编码。我宁愿把它封装到一个emailnotifier中,我可以插入到需要它的事件中。蜂鸣器通知呢?还是手机?黑莓?相同的架构,不同的通知程序。

    是否要包括用于人机交互的处理程序?我处理的所有工作流都是人工和自动处理的混合体。

    您是否希望连接到其他系统,如数据库、其他应用程序、Web服务?

    这是个棘手的问题。祝你好运。

        2
  •  0
  •   Tom A    16 年前

    @埃里克:(就我的答案的适用性发表评论。)如果你喜欢设计和构建你自己的定制工作流系统的技术挑战,那么我的答案没有帮助。但是,如果您试图用将来需要支持的代码来解决实际的WF问题,那么我建议您使用内置的WF系统。

    工作流程 支持现在是.NET框架的一部分,称为 “工作流基础(WF)) “。正如达菲莫在他的“在构建之前购买”评论中指出的那样,学习如何使用内置库几乎比编写自己的库容易得多。

    工作流用XAML表示,并由Visual Studio中的设计器支持。 有三种类型的工作流(来自维基百科,链接如下)

    • 顺序工作流 (通常是流程 基于图表,从一个阶段开始 到下一个且不后退)
    • 状态 机器工作流程 (从 “状态”到“状态”,这些工作流 更复杂,返回到 上一点,如果需要)
    • 规则驱动的工作流 (实施) 基于顺序/状态机 工作流程。规则规定 工作流程的进度)

    维基百科: Windows Workflow Foundation

    MSDN: Getting Started with Workflow Foundation (WF)