C# 这个工作流系统的设计好吗?
我正在设计一个系统,允许我将大范围的任务表示为工作流,通过IEnumerable方法公开它们的工作项。这里的意图是使用C#的“屈服”机制,允许我编写psuedo过程代码,工作流执行系统可以根据需要执行这些代码 例如,假设我有一个工作流,其中包括在数据库上运行查询,并在查询返回特定结果时发送电子邮件警报。这可能是工作流:C# 这个工作流系统的设计好吗?,c#,workflow,C#,Workflow,我正在设计一个系统,允许我将大范围的任务表示为工作流,通过IEnumerable方法公开它们的工作项。这里的意图是使用C#的“屈服”机制,允许我编写psuedo过程代码,工作流执行系统可以根据需要执行这些代码 例如,假设我有一个工作流,其中包括在数据库上运行查询,并在查询返回特定结果时发送电子邮件警报。这可能是工作流: public override IEnumerable<WorkItem> Workflow() { // These would probably be i
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:这件事的范围将非常有限,因为它是针对个人项目的,所以买东西是直接的。我不需要工作流本身的构建后配置,尽管工作项的配置是必要的。就电子邮件服务器、数据库等而言,它们是。。。。。。在那里只是为了以身作则。我主要是想解决一个本质上是模块化的问题,但是一旦我确定了工作流本身,它就不会改变,除非需求改变。人机交互将被限制为取消或暂停整个工作流,而不是-。。。。。。让工作流通过界面或任何东西与用户交互。至于状态机,我从这种模型开始,但后来意识到我在重写轮子