C# 这个工作流系统的设计好吗?

C# 这个工作流系统的设计好吗?,c#,workflow,C#,Workflow,我正在设计一个系统,允许我将大范围的任务表示为工作流,通过IEnumerable方法公开它们的工作项。这里的意图是使用C#的“屈服”机制,允许我编写psuedo过程代码,工作流执行系统可以根据需要执行这些代码 例如,假设我有一个工作流,其中包括在数据库上运行查询,并在查询返回特定结果时发送电子邮件警报。这可能是工作流: public override IEnumerable<WorkItem> Workflow() { // These would probably be i

我正在设计一个系统,允许我将大范围的任务表示为工作流,通过IEnumerable方法公开它们的工作项。这里的意图是使用C#的“屈服”机制,允许我编写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
}
public override IEnumerable工作流(){
//这些可能是从其他地方注入的
var db=新的db();
var emailServer=new emailServer();
//这里还有其他工作项目吗
var ci=新的FindLowInventoryItems(db);
收益率ci;
if(ci.LowInventoryItems.Any()){
var电子邮件=新发送电子邮件至仓库(“库存较低”,ci.LowInventoryItems);
返回电子邮件;
}
//这里还有其他工作项目吗
}
CheckInventory和EmailWarehouse是从WorkItem派生的对象,WorkItem具有子类实现的抽象Execute()方法,封装了这些操作的行为。Execute()方法在工作流框架中被调用-我有一个WorkflowRunner类,它枚举workflow(),围绕workitem包装前事件和后事件,并在事件之间调用Execute。这允许使用应用程序在工作项之前或之后执行任何需要的操作,包括取消、更改工作项属性等

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


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

就我个人而言,这对我来说是一个“先买后造”的决定。在我写之前我会先买些东西

我为一家规模相当大的公司工作,在金钱上可能会很愚蠢,所以如果你是为自己写这篇文章,但买不到东西,我会收回这篇评论

以下是一些随机的想法:

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

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

我希望能够插入不同的操作,以便能够动态定制不同的流

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

我不希望看到任何像电子邮件服务器那样硬编码的东西。我宁愿将其封装到一个EmailNotifier中,以便插入需要它的事件。那传呼机通知呢?还是手机?黑莓相同的体系结构,不同的通知程序

是否要包含用于人员交互的处理程序?我处理的所有工作流都是人工和自动化处理的混合

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

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

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

<强>工作流支持现在是.NETFramework的一部分,被称为“工作流基础(WF)”。正如duffymo在他的“先买后建”评论中指出的那样,学习如何使用内置库几乎肯定比编写自己的库容易

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

  • 顺序工作流(通常为流程 基于图表,从一个阶段开始 到下一步,不后退)
  • 陈述 机器工作流(从 “状态”到“状态”,这些工作流 更为复杂,并返回到 上一点(如果需要)
  • 规则驱动的工作流(已实现) 基于顺序/状态机 工作流程。规则规定了 (工作流程的进展)
维基百科:


MSDN:

这件事的范围将非常有限,因为它是针对个人项目的,所以买东西是直接的。我不需要工作流本身的构建后配置,尽管工作项的配置是必要的。就电子邮件服务器、数据库等而言,它们是。。。。。。在那里只是为了以身作则。我主要是想解决一个本质上是模块化的问题,但是一旦我确定了工作流本身,它就不会改变,除非需求改变。人机交互将被限制为取消或暂停整个工作流,而不是-。。。。。。让工作流通过界面或任何东西与用户交互。至于状态机,我从这种模型开始,但后来意识到我在重写轮子