工作流原理Word格式文档下载.docx
- 文档编号:5202396
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:17
- 大小:1MB
工作流原理Word格式文档下载.docx
《工作流原理Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《工作流原理Word格式文档下载.docx(17页珍藏版)》请在冰点文库上搜索。
3.1WorkflowLibrary这个项目包含了工作流设计,它是可视化设计的成果。
下图是一个典型的审批流程
3.2OrderApprovalEventType这个项目包含了工作流设计时可能会用到的一些接口和事件定义。
为什么需要用事件呢?
一般我们的流程如果需要等待用户干预,诸如审批之类的情况,就需要这样做,因为它可能不是立即发生的。
注意,接口要标记为ExternalDataExchange,事件参数需要继承ExternalDataEventArgs,而且必须可序列化
3.3Contracts这个项目是标准的WCF合约定义,因为我们是分了服务器和客户端的,他们之间通过WCF通讯,包括创建流程,以及激发事件等等
3.4Services,这就是具体实现的WCF服务,在这里可以启动工作流运行时,并且按照客户端指令做相应的事情。
这里的代码是相当多的。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingContracts;
usingSystem.ServiceModel;
usingSystem.Workflow.Runtime;
usingOrderApprovalEventType;
usingSystem.Workflow.Activities;
usingSystem.Workflow.Runtime.Hosting;
usingSystem.Workflow.Runtime.Tracking;
namespaceServices
{
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]//只有一个实例
publicclassOrderService:
IOrderService
{
//运行时
privateWorkflowRuntimeruntime=null;
//所有实例
privateList<
WorkflowIntanceData>
instances=newList<
();
//本地服务
LocalServicelocal=null;
publicOrderService(){
runtime=newWorkflowRuntime();
//添加数据交换服务,可以激发事件
ExternalDataExchangeServicesvr=newExternalDataExchangeService();
runtime.AddService(svr);
local=newLocalService();
svr.AddService(local);
//添加持久化服务,保存实例
//F:
\Windows\Microsoft.NET\Framework\v3.0\WindowsWorkflowFoundation\SQL\zh-CHS这里会有脚本
vardb="
server=(local);
database=WorkflowFoundation;
integratedsecurity=true"
;
SqlWorkflowPersistenceServicesqlsvc=newSqlWorkflowPersistenceService(db);
runtime.AddService(sqlsvc);
//添加跟踪服务,可以对服务进行诊断和调试
SqlTrackingServicetracksvc=newSqlTrackingService(db);
runtime.AddService(tracksvc);
//绑定有关的事件
runtime.WorkflowStarted+=newEventHandler<
WorkflowEventArgs>
(runtime_WorkflowStarted);
runtime.WorkflowCompleted+=newEventHandler<
WorkflowCompletedEventArgs>
(runtime_WorkflowCompleted);
runtime.WorkflowCreated+=newEventHandler<
(runtime_WorkflowCreated);
runtime.WorkflowAborted+=newEventHandler<
(runtime_WorkflowAborted);
runtime.WorkflowTerminated+=newEventHandler<
WorkflowTerminatedEventArgs>
(runtime_WorkflowTerminated);
runtime.WorkflowUnloaded+=newEventHandler<
(runtime_WorkflowUnloaded);
runtime.StartRuntime();
//启动运行时
Console.WriteLine("
工作流服务器已经准备就绪"
);
//加载那些保存好的流程实例
foreach(variteminsqlsvc.GetAllWorkflows())
varinstance=(WorkflowLibrary.Workflow1)runtime.GetWorkflow(item.WorkflowInstanceId).GetWorkflowDefinition();
instances.Add(
newWorkflowIntanceData()
Id=item.WorkflowInstanceId,
Amount=instance.Amount
});
}
voidruntime_WorkflowUnloaded(objectsender,WorkflowEventArgse)
时间:
{0},卸载流程:
{1}"
DateTime.Now,e.WorkflowInstance.InstanceId);
voidruntime_WorkflowTerminated(objectsender,WorkflowTerminatedEventArgse)
{0},终止流程:
voidruntime_WorkflowAborted(objectsender,WorkflowEventArgse)
{0},中断流程:
voidruntime_WorkflowCreated(objectsender,WorkflowEventArgse)
{0},创建流程:
voidruntime_WorkflowCompleted(objectsender,WorkflowCompletedEventArgse)
varfound=instances.FirstOrDefault(d=>
d.Id==e.WorkflowInstance.InstanceId);
if(found!
=null)
instances.Remove(found);
{0},完成流程:
voidruntime_WorkflowStarted(objectsender,WorkflowEventArgse)
{0},启动流程:
#regionIOrderService成员
publicvoidStartRequest(Guidid,intamount)
//准备数据
varinitParam=newDictionary<
string,object>
initParam.Add("
Amount"
amount);
//创建实例
varinstance=runtime.CreateWorkflow(
typeof(WorkflowLibrary.Workflow1),
initParam,
id);
//保存有关数据
newWorkflowIntanceData(){
Id=id,
Amount=amount,
RequestEmployee="
陈希章"
//启动实例
instance.Start();
publicvoidProcessRequest(Guidid,OrderApprovalEventType.ProcessResultresult,stringnotes)
varargs=newProcessEventArgs(id);
args.Result=result;
args.Notes=notes;
//从集合中删除掉有关的实例
d.Id==id);
local.RaiseEvent(args);
//激发事件
publicList<
GetWorkflowInstances()
returninstances.Where(d=>
d.Amount>
=2000).ToList();
#endregion
publicvoidUnLoad(Guidid)
runtime.GetWorkflow(id).Unload();
//要求开启MSDTC服务
~OrderService(){
//析构的时候将所有未完成的工作流实例保存起来
foreach(variteminruntime.GetLoadedWorkflows())
item.Unload();
publicvoidUnloadAllInstances(){
[Serializable]//这个必须标记为可序列化
internalclassLocalService:
ManagerEvent
#regionManagerEvent成员
publiceventEventHandler<
ProcessEventArgs>
Process;
internalvoidRaiseEvent(ProcessEventArgse){
//这里可能要更新数据库
if(Process!
Process(this,e);
}
注意:
这里有一个所谓本地服务的概念,是要实现第二步的那个接口,并编写有关触发事件的代码
3.5HostService如上都准备好之后,接下来就是通过一定的方式托管这些服务了。
我们可以采用WindowsService来托管
3.6SimpleClient最后当然少不了要有客户端界面来实现一些操作。
我们这里使用了WindowsForms作为界面。
usingSystem.Windows.Forms;
namespaceSimpleClient
publicpartialclassForm1:
Form
IOrderServiceproxy=null;
publicForm1()
InitializeComponent();
protectedoverridevoidOnLoad(EventArgse)
base.OnLoad(e);
ChannelFactory<
IOrderService>
factory=newChannelFactory<
(newBasicHttpBinding(),newEndpointAddress("
http:
//localhost:
8080/OrderService"
));
proxy=factory.CreateChannel();
privatevoidbtRequest_Click(objectsender,EventArgse)
intamount=int.Parse(txtAmount.Text);
proxy.StartRequest(Guid.NewGuid(),amount);
MessageBox.Show("
已经发起了一个订单"
privatevoidbtGet_Click(objectsender,EventArgse)
dgvRequests.DataSource=proxy.GetWorkflowInstances();
privatevoiddgvRequests_CellEnter(objectsender,DataGridViewCellEventArgse)
btOK.Enabled=btCancel.Enabled=true;
privatevoiddgvRequests_CellLeave(objectsender,DataGridViewCellEventArgse)
//btOK.Enabled=btCancel.Enabled=false;
privatevoidbtOK_Click(objectsender,EventArgse)
varrow=dgvRequests.Rows[dgvRequests.SelectedCells[0].RowIndex];
varid=(Guid)row.Cells[0].Value;
proxy.ProcessRequest(
id,OrderApprovalEventType.ProcessResult.Approval,txtNotes.Text);
privatevoidbtCancel_Click(objectsender,EventArgse)
id,OrderApprovalEventType.ProcessResult.Reject,txtNotes.Text);
privatevoidbtUnload_Click(objectsender,EventArgse)
proxy.UnLoad(id);
这样,一套工作流解决方案就做好了。
这个架构可以供很多朋友参考
另外,下面有几篇有关的文章可以参考学习
工作流内部工作原理
(一)
工作流内部工作原理
(二)
工作流内部工作原理(三)
分类:
Microsoft.NET
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工作流 原理