繁体   English   中英

编写一个简单的工作流程系统

[英]Write a simple workflow system

作为我们应用程序的一部分,我需要编写“简单”工作流系统,该系统将用于支持文档创建生命周期。 它应支持:-不同的活动:编辑文档,验证文档(批准,拒绝),发布文档...-将这些活动分配给不同的人员/用户-“并行拆分和合并”。 例如,我想支持这样的工作流程:

- begin
1.) Create document
2.) Translate document
2.1) Translate into English
2.1.1) Translate document into English
2.1.2) Verify English translation
2.2) Translate into Italian
2.2.1) Translate document into Italian
2.2.2) Verify Italian translation
3.) Verify complete document
4.) Publish document
- end

它将在asp.net应用程序(C#)中使用。

最后一部分:我想知道是否有任何模式,库或文章可以帮助我开始执行此任务? 世界自然基金会对此是否合适?

有一些资料(甚至在stackoverflow上),但是我不知道如何处理并行性?

工作流引擎是一个看似简单的概念。 创建一个健壮的,可管理的实施工作比看起来要多得多。 强烈支持现成的,而不是自己构建。 WWF(Windows Workflow Foundation)看起来很适合您的需求。

WF虚拟实验室一起玩耍。 一旦掌握了该技术,便可以更好地了解WF是否合适或应该自己开发。 另外,您可以签出K2 ,但这要重得多。

我将只使用Windows Workflow,这样就可以相对容易地对工作流进行建模,并且您不必担心自己不在意的问题,例如跟踪工作流状态以及诸如此类的事情,这些事情不在您的业务范围内域问题。

http://msdn.microsoft.com/en-us/library/aa480214.aspx

几年前,我参与了一个实施工作流系统的项目,由于数据库已经存在,这是一个家庭开发的解决方案。基本上,我们为基于可可的解决方案提供了Web界面。

您可以使用开源BPM解决方案(我见过Java的JBPM,您可以搜索一个基于ASP的优秀开源解决方案)。这些解决方案大多数都是基于流程的,换句话说,您在xml文件中定义了流程或工作流程。批准者是一个节点,如果只有父节点得到批准,树中的下一个节点就会出现。您可以在网络上获得良好的文档。

同样ASP也不是问题。对于您自己的解决方案,我建议您先创建数据库。基本上,您需要一种在数据库中存储树结构的方法。如果两个节点具有相同的父节点,则可以并行处理,您可以放置​​一个仅当两个节点的has_approved = 1时,“ has_approved”和flow之类的属性才会进一步发展。

我希望这是一个更广泛的主题,如果您采用开源BPM解决方案,请选择最简单的解决方案,因为您将不得不更改代码以适合您的特定解决方案。

尽管您的要求是可能的,但基于.NET 3.x工作流运行时滚动自己的工作流主机并没有“简单”。 从做过此事的人那里得到。 在.NET 4.0中,它将变得更加容易,因此值得考虑的是,您的解决方案将在几个月后淘汰。

如果您的问题域仅包含基于文档的工作流,强烈建议您考虑使用SharePoint解决方案。 请参阅以下链接以获取有关此选项的一些信息:

http://office.microsoft.com/zh-cn/sharepointdesigner/HA101005911033.aspx http://channel9.msdn.com/posts/RobertShelton/Building-an-Approval-Workflow-with-SharePointMOSS-2007-and-Visual -工作室-2008 /

实施起来并不难。 我发现它很简单,不需要庞大的打包解决方案。

您需要确定要监视哪些项目(文档)。 然后,您需要确定这些文档可以处于哪些状态(或多个状态)。这些状态记录了文档在处理中所处的步骤。 (在您的“工作流程”中)。 您已经在帖子中做到了。

状态机是一种出色的模式,可以处理各种状态下的文档移动: http : //en.wikipedia.org/wiki/State_machine

您仍然必须建立一个文档可能处于的每个状态的列表,以及将其移动到新状态时会发生什么情况。 您已经完成了大部分工作。 您分配的代码不应超过一两页。

一个示例实现:

为每个文档分配一个编号,以便您可以对其进行跟踪,并为其分配一个状态,以显示该文档在处理中的位置。 通常,这两者都是用数字完成的,但不一定要这样做。

像这样:

public class document
{
  public int documentId;
  public String documentStatus;
}

// create a new document to track
document doc = new document();
doc.documentId = 42;       // arbitrary id#
doc.documentStatus = "1";  // document is at the start of the process

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM