设备申请审批流程(WF实例)(转载)

         今天在网上看了这篇关于 WF 在实际项目中应用的实例,感觉有一定的意义,特别在此转载一下。如
果有可能实现,到时候再与大家好好分享一下。 42.gif

        这个例子在我们的项目中已经实际应用,所以我想叫做实例应该没什么问题。这是一个经典的设备申
请审批流程,大家很多时候已经用其他的办法实现过了。本实例包括三个工程:EquipmentApply(设备申请
exe)、EquipmentApprove(设备审批exe)、EquipmentApplyWorkflowLib(申请审批流程库dll)。首先新建
Windows应用程序项目EquipmentApply,界面如图所示:
        添加Windows应用程序项目EquipmentApprove,界面如图所示:
        添加Workflow中的Sequential Workflow Library项目EquipmentApplyWorkflowLib,建立流程图:
        该流程包括三个外部方法 Activities(CreateApply、ApproveApply、EscalateApply)和两个外部事件
Activities(EquipmentApprove、ApplyEscalated),一个 ListenActivity 用于等待外部事件来重新唤起流
程。这里头有几个关键的技术点:
        1、怎么传递流程参数?启动流程实例时把参数装载到Dictionary中作为CreateWorkflow方法的参数传递:
None.gif //  Fill the Parameters collection for this instance of the workflow
None.gif
Dictionary < string object >  parameters  =   new  Dictionary < string object > ();
None.gifparameters.Add(
" CreatedBy " , txtCreatedBy.Text);
None.gifparameters.Add(
" EquipmentName " , txtName.Text);
None.gifparameters.Add(
" Numbers " ,StrToInt(txtNumbers.Text));
None.gifparameters.Add(
" Moneys " , StrToFloat(txtMoneys.Text));
None.gifparameters.Add(
" Desc " , txtDesc.Text);
None.gif
//  Get the type of the workflow
None.gif
Type type  =   typeof (EquipmentApplyWorkflowLib.EquipmentApplyWorkflow);
None.gif
//  Start the workflow instance
None.gif
WorkflowInstance inst  =  theWorkflowRuntime.CreateWorkflow(type, parameters);
None.gifinst.Start();
        获取参数是在流程文件中建立相同名称的属性,流程中就可以得到这些参数:
None.gif private   string  m_EquipmentName  =   "" ;
None.gif
public   string  EquipmentName
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn m_EquipmentName; }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ m_EquipmentName = value; }
ExpandedBlockEnd.gif}

None.gif
private   int  m_Numbers  =   0 ;
None.gif
public   int  Numbers
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn m_Numbers; }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ m_Numbers = value; }
ExpandedBlockEnd.gif}

None.gif
private   float  m_Moneys  =   0 ;
None.gif
public   float  Moneys
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn m_Moneys; }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ m_Moneys = value; }
ExpandedBlockEnd.gif}

None.gif
private   string  m_Desc  =   "" ;
None.gif
public   string  Desc
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn m_Desc; }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ m_Desc = value; }
ExpandedBlockEnd.gif}

None.gif
private   string  m_CreatedBy  =   "" ;
None.gif
public   string  CreatedBy
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
get dot.gifreturn m_CreatedBy; }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
set dot.gif{ m_CreatedBy = value; }
ExpandedBlockEnd.gif}
        2、 怎么持久化流程?需要在初始化流程运行时的时候增加增加其久化服务:
None.gif //  Add system SQL Persistence service
None.gif
SqlWorkflowPersistenceService persistenceService  =   new  SqlWorkflowPersistenceService(
None.gif
" Initial Catalog=PersistenceStore; "   +
None.gif
" Data Source=localhost\\SQLExpress; Integrated Security=SSPI " );
None.gifwr.AddService(persistenceService);
        还需要增加空闲时事件:
wr.WorkflowIdled  +=   new  EventHandler < WorkflowEventArgs > (wr_WorkflowIdled);
        下面的代码表示在流程空闲时持久化(事实上是保存到数据库,也可以包括到文件,你也可以随时持
久化流程)。
None.gif void  wr_WorkflowIdled( object  sender, WorkflowEventArgs e)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    ThreadPool.QueueUserWorkItem(UnloadInstance, e.WorkflowInstance);
ExpandedBlockEnd.gif}

None.gif
static   void  UnloadInstance( object  workflowInstance)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    ((WorkflowInstance)workflowInstance).TryUnload();
ExpandedBlockEnd.gif}
        3、怎么增加自定义的服务?需要增加服务接口和参数类:
None.gif [Serializable]
None.gif
public   class  EquipmentApplyEventArgs : ExternalDataEventArgs
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
private string _operatorName;
InBlock.gif
public EquipmentApplyEventArgs(Guid InstanceID, string operatorName)
InBlock.gif
base(InstanceID)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif_operatorName 
= operatorName;
ExpandedSubBlockEnd.gif}

InBlock.gif
public string OperatorName
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif
get dot.gifreturn _operatorName; }
ExpandedSubBlockStart.gifContractedSubBlock.gif
set dot.gif{ _operatorName = value; }
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif}

None.gif[ExternalDataExchange]
None.gif
public   interface  IEquipmentApplyService
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif
event EventHandler<EquipmentApplyEventArgs> EquipmentApplyApproved;
InBlock.gif
event EventHandler<EquipmentApplyEventArgs> EquipmentApplyEscalated;
InBlock.gif
void CreateEquipmentApply(string name, int numbers, float moneys, string description, string createdBy);
InBlock.gif
void ApproveEquipmentApply(Guid applyID);
InBlock.gif
void EscalateEquipmentApply(Guid applyID);
ExpandedBlockEnd.gif}

None.gif[ExternalDataExchange]
// 对于服务接口是必要的声明,否则不能把服务增加到流程中。增加一个类实现这个接口:
None.gif
  public   class  EquipmentApplyService: IEquipmentApplyService
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif {
InBlock.gif
// Implement events
InBlock.gif
public event EventHandler<EquipmentApplyEventArgs> EquipmentApplyApproved;
InBlock.gif
public event EventHandler<EquipmentApplyEventArgs> EquipmentApplyEscalated;
InBlock.gif
public void RaiseApproveEquipmentApplyEvent(Guid instanceId)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
// Raise the event to the workflow
InBlock.gif
ThreadPool.QueueUserWorkItem(JustApproveTheEquipmentApply,
InBlock.gif
new EquipmentApplyEventArgs(instanceId, "ljc"));
ExpandedSubBlockEnd.gif}

InBlock.gif
public void JustApproveTheEquipmentApply(object o)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifEquipmentApplyEventArgs args 
= o as EquipmentApplyEventArgs;
InBlock.gif
if (EquipmentApplyApproved != null)
InBlock.gifEquipmentApplyApproved(
null, args);
InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifSystem.Windows.Forms.MessageBox.Show(
"设备申请审批为空");
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}

InBlock.gif
public void RaiseEscalateEquipmentApplyEvent(Guid instanceId)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif
// Raise the event to the workflow
InBlock.gif
ThreadPool.QueueUserWorkItem(JustEscalateTheEquipmentApply,
InBlock.gif
new EquipmentApplyEventArgs(instanceId, "ljc"));
ExpandedSubBlockEnd.gif}

InBlock.gif
public void JustEscalateTheEquipmentApply(object o)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifEquipmentApplyEventArgs args 
= o as EquipmentApplyEventArgs;
InBlock.gif
if (EquipmentApplyEscalated != null)
InBlock.gifEquipmentApplyEscalated(
null, args);
InBlock.gif
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gifSystem.Windows.Forms.MessageBox.Show(
"设备申请呈送上级领导为空");
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}
ContractedBlock.gif ExpandedBlockStart.gif IEquipmentApplyService #region IEquipmentApplyService
InBlock.gif
void IEquipmentApplyService.CreateEquipmentApply(string name, int numbers, float moneys, string description, string createdBy)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
// Fill up a EquipmentApply: same ID as the workflow
InBlock.gif
    string applyID = WorkflowEnvironment.WorkflowInstanceId.ToString();
InBlock.gif    
// Create EquipmentApply on the DB
InBlock.gif
    EquipmentApplyRule.CreateEquipmentApply(applyID,name,numbers,moneys, description, createdBy);
ExpandedSubBlockEnd.gif}

InBlock.gif
void IEquipmentApplyService.ApproveEquipmentApply(Guid applyID)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
// Update EquipmentApply on the DB
InBlock.gif
    EquipmentApplyRule.UpdateEquipmentApply(WorkflowEnvironment.WorkflowInstanceId.ToString(), EquipmentApplyStatus.Approved);
ExpandedSubBlockEnd.gif}

InBlock.gif
void IEquipmentApplyService.EscalateEquipmentApply(Guid applyID)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
// Update EquipmentApply on the DB
InBlock.gif
    EquipmentApplyRule.UpdateEquipmentApply(WorkflowEnvironment.WorkflowInstanceId.ToString(), EquipmentApplyStatus.Escalated);
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
#endregion

None.gif     }
      在初始化流程运行时的时候就可以把服务增加进来:
//  Add the external data service
ExternalDataExchangeService dataService  =   new  ExternalDataExchangeService();
wr.AddService(dataService);
//  Add custom EquipmentApply service
theApplyService  =   new  EquipmentApplyService();
dataService.AddService(theApplyService);
原文地址:http://blog.csdn.net/artlife/archive/2007/01/09/1477719.aspx

转载于:https://www.cnblogs.com/CNWF/archive/2007/02/01/637350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值