{S0}本文的目的
显示,快速浏览,工作流程的基础和突出的基本知识我们应该知道在创建第一个有用的工作流应用程序,
突出的设计指导方针,以创建可重用的工作流应用程序。最后,品味的是通用的,任何有用的工作流程,通过一个示例项目文档工作流系统,从客户端应用程序管理应用程序使用数据库。工作流程的基础上,简要:我们可以看到,工作流程的基础上,仅仅作为一种工作的活动,可以收集通过特定目的的条件和规则。Workflow Foundation是不是如果循环块的其他块,如果它是实现这个简单的算法,将花费我们很多没有任何好处。使用底线工作流程的基础,简化了一个复杂的算法来简单的可视化编辑的,维护的工作流程,取代我的老设计,工作流程:
我用命令模式,在我的工作很多,作为一个请求封装在单个对象称为命令,即初始化参数,然后执行方法将被调用来检索结果,或做的具体任务,但我始终有一个共享的属性,信息和资源的问题,或者其他命令的结果(S),有些命令是等待,直到其他命令完成后,和其他人将开始从他人的终点,为了解决这个问题,我总是用一个调停人在大多数情况下是的CommandManager类,它有一个命令的集合,知道所有的执行顺序命令,并分享所有的参数,通过容器的范围,并在每个命令已命令经理的引用,因此,它可以访问所有其他命令的所有属性,很容易的,或设置任何其他命令或出客户端应用程序的财产。最后使设计好,我总是从CommandBase继承的所有命令抽象类给我合同的所有命令,这样的CommandManager执行和初始化所有儿童的命令。有趣的是,每次我尝试创建命令对象,我发现自己犯了同样的通用模式,并想知道是否有什么办法可以形象化为更好地利用这些库?有一次,我看到的顺序工作流活动的第一次,我说:"啊哈"这正是我想要的,命令(活动),有一个容器命令经理(SequentialWorkflowActivity),和所有的命令具有相同的接口或基类
(活动),和所有的命令可以得到命令经理的联络数据顺序工作流最后可视化快速发展的每一个东西,它是更好的可维护性一个伟大的东西。我印象中的工作流程的基础?确保每一个工作流程中的基础件事给我留下深刻的印象,但添加服务的理念(S)在运行时,然后使用这项服务,在工作流程中,通过引用服务使用WorkflowRuntime的对象,或通过特殊的公共方法GetService喜欢的CallExternalMethodActivity,HandleExternalEventActivity活动,它是奇妙的想法,因为简单,可以单独所有的抽象类和接口到单独的程序,然后使工作流程和核心应用参考大会,所以你增加了工作流程的可重用性的水平,因为工作流程编码对接口(S),但你可以在运行时注册任何具体的类,实现这个接口,可以整合推出精彩的供应商模式,在与2。NET奇妙的工作流程,通过在web.config中注册工作流程中的任何服务的基础,节(这个话题超出了这个简单的项目),一旦你了解如何使用,在工作流程的自定义服务,您将了解所有其他服务,包括"盒子"像WorkflowPersistenceService这样的服务,WorkflowSchedulerService,TrackingService,..基础知识,你应该知道,在开发,第一个实际应用,正如我所说,用一堆"的if else"语句的工作流程,不是个好主意所有,你应该知道你应该知道的有关工作流的最低限度的信息如何将参数传递到工作流程和检索参数,之后的工作流程?完成。??如何创建一个自定义活动,工作的具体任务。??内的工作流程如何使用定制的服务,这个服务和消费。??如何通过从主机应用程序的工作流程或工作流应用程序的数据通过工作流处理。我认为这是最起码的,你应该知道创建一个先进的工作有用的工作流应用程序的工作流程,您可能需要到现在,?使用WorkflowPersistenceService,并加载和卸载到数据库,??事务的范围内使用数据的一致性。??创建故障处理程序,在内部的工作流程发生错误情况下。苏,是有很大关系提及,工作流程,特别是如果你使用Asp.NET应用程序的工作流程
在web服务,或者你认为更新完成后,工作流简单的Windows窗体或在特定事件。但是,这并不是本文的目的。设计指导方针与工作流程的基础工作我尝试申请对象的工作流程,我已经写了我的技能,在使用前面向对象编程,使用工作流,但是我发现它是相当困难的使用工作流,我的代码没有任何准备,完全像我第一次尝试使用单位测试,测试"没有可测试的"应用程序我发现,我要通过依赖注入我的代码可测试构造函数注入和mockobjects现在使用的工作流程,你必须改变你的方式,在发展中国家,因此,而不是使用100%面向对象编程,你应该从具体对象行为服务类,使您的代码将更多的面向服务准备之前,你的代码,使用工作流的步骤:
基本3步骤1)独立的服务对象行为。2)提取这些服务接口(用户voisual stodio 5重构),因此所有您的服务,实现服务接口3)这些接口分开,单独大会考虑这个简单的例子假设你总是使用一类名为客户,这些属性编号,姓名,地址,这些方法添加(),更新(),删除(),连接(),注册(),注销(),..要使用工作流,你应该分开这个对象的状态和Identitylike,如ID,名称地址和移动的行为(方法,事件,..)的CustomerService实施ICustomerService。在这种情况下,您可以使用与你编写的代码很容易的工作流程。在源样本,
你会看到文档对象从IDocumentService,既继承他们用于描述整个文件的过程样板工程简介解决方案样本是公共对象的3个基本项目和其他2个项目接口。应用程序的想法是用户将与他的客户端应用程序创建一个文件,用户还可以更新他的文件,只要打开沙爹。然后用户将投入到工作流程的文件,然后根据文件属性,工作流会选择管理员(S),即授权批准这个文件,并将数据保存到数据库,并会等待,直到管理员完成循环。管理员(样本将无密码)登录屏幕后,将看到所有等着他的文件, 然后,他将批准或拒绝文档,因此,文件将被标记为核准或再次打开状态的用户,可以更新的文件,或者把它删除或重新再次提交的工作流程,
客户端应用程序示例{S1}创建文档内的主要形式
IDocument服务类图文档数据库关系图文件服务类图的{C}管理中的应用程序{五} private void btnCreateDocument_Click(object sender, EventArgs e)
{
if (ValidateForm())
{
Document _document = new Document();
_document.Category = (Category)this.cmbCategory.SelectedItem;
_document.Title = this.txtTitle.Text.Trim();
_document.Description = this.txtDescription.Text.Trim();
_document.Depositor = User.CurrentUser.UserName;
_service.CreateDocument(_document);
ConfirmSuccess();
}
else {
MessageBox.Show("Please complete, the form's fields", "Validation, Error", MessageBoxButtons.OK
, MessageBoxIcon.Error);
}
}
结论工作流程的基础上,采取完全关闭所有的复杂性负担应用程序规则和决策但是,以达到最大的可重用性,你必须准备通过创建服务的代码,独立抽象单独的服务
集会| Refky Wahib private void approveToolStripMenuItem_Click(object sender, EventArgs e)
{
_documentID = int.Parse(dgrdDocuments.CurrentRow.Cells["ID"].Value.ToString());
DialogResult result = MessageBox.Show("Are you sure that you want to Approve this document", "confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
Document doc = null;
if (result == DialogResult.Yes)
{
doc = _service.GetDocumentByID(this._documentID);
if (doc.Status != DocumentBaseLibrary.Status.InWorkflow)
{
MessageBox.Show(string.Format("This document {0} is not in Workflow state", doc), "Error", MessageBoxButtons.OK
, MessageBoxIcon.Error);
return;
}
Approve(doc);
}
}
private void Approve(Document doc)
{
DocumentWorkflowItem wfItem=_service.GetWorkflowItem(doc);
// Get the type of the workflow
Type type = typeof(DocumentWorkflow.DocumentWorkflow);
// Start the workflow instance
Guid id = wfItem.WorkflowID;
try
{
WorkflowInstance inst = theWorkflowRuntime.GetWorkflow(id);
inst.Load();
this._service.RaiseApproveDocumentWorkflow(wfItem);
}
catch(Exception ex)
{
MessageBox.Show("The Document cannot be loaded. " + ex.ToString(),
"Administration", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}