5

我正在设计一个系统,该系统允许我将广泛的任务表示为工作流,通过 IEnumerable 方法公开它们的工作项。此处的目的是使用 C# 的“yield”机制来允许我编写工作流执行系统可以按照它认为合适的方式执行的伪过程代码。

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

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 的对象,它具有子类实现的抽象 Execute() 方法,封装了这些操作的行为。Execute() 方法在工作流框架中被调用 - 我有一个 WorkflowRunner 类,它枚举 Workflow(),围绕工作项包装前后事件,并在事件之间调用 Execute。这允许消费应用程序在工作项之前或之后执行它需要的任何操作,包括取消、更改工作项属性等。

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

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

4

2 回答 2

2

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

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

以下是一些随机的想法:

我会将工作流程外部化为我可以在启动时读取的配置,可能来自文件或数据库。

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

我希望能够插入不同的操作,以便可以即时自定义不同的流程。

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

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

你想包含一个处理程序来进行人机交互吗?我处理的所有工作流程都是人工和自动化处理的混合体。

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

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

于 2009-01-16T01:08:34.533 回答
0

@Erik:(针对我的答案的适用性发表评论。)如果您喜欢设计和构建自己的自定义工作流系统的技术挑战,那么我的回答没有帮助。但是,如果您尝试使用未来需要支持的代码来解决现实世界的 WF 问题,那么我建议使用内置的 WF 系统。

工作流支持现在是 .Net 框架的一部分,称为“工作流基础 (WF) ”。几乎可以肯定,学习如何使用内置库比编写自己的库更容易,正如 duffymo 在他的“构建前购买”评论中指出的那样。

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

  • 顺序工作流程(通常基于流程图,从一个阶段进展到下一个阶段并且不会后退)
  • 状态机工作流程(从“状态”到“状态”的进展,这些工作流程更复杂,如果需要,可以返回到前一点)
  • 规则驱动的工作流程(基于 Sequential/StateMachine 工作流程实现。规则决定工作流程的进度)

维基百科:Windows 工作流基金会

MSDN:Workflow Foundation (WF) 入门

于 2009-01-16T05:10:36.820 回答