Windows Workflow Foundation Entry

把知道的都告诉别人,不断地琢磨别人不知道什么,只要先一分钟知道就行了,知识和经验根本就存不住。
MSN群:cnedn.net@hotmail.com(VS.Net SQL 开发交流)cnedn.wf@hotmail.com (Windows Workflow Foundation 开发交流)cnedn@hotmail.com(工作流经验交流)

博客园 首页 新随笔 联系 订阅 管理
         今天在网上看了这篇关于 WF 在实际项目中应用的实例,感觉有一定的意义,特别在此转载一下。如
果有可能实现,到时候再与大家好好分享一下。

        这个例子在我们的项目中已经实际应用,所以我想叫做实例应该没什么问题。这是一个经典的设备申
请审批流程,大家很多时候已经用其他的办法实现过了。本实例包括三个工程: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方法的参数传递:
// Fill the Parameters collection for this instance of the workflow
Dictionary<stringobject> parameters = new Dictionary<stringobject>();
parameters.Add(
"CreatedBy", txtCreatedBy.Text);
parameters.Add(
"EquipmentName", txtName.Text);
parameters.Add(
"Numbers",StrToInt(txtNumbers.Text));
parameters.Add(
"Moneys", StrToFloat(txtMoneys.Text));
parameters.Add(
"Desc", txtDesc.Text);
// Get the type of the workflow
Type type = typeof(EquipmentApplyWorkflowLib.EquipmentApplyWorkflow);
// Start the workflow instance
WorkflowInstance inst = theWorkflowRuntime.CreateWorkflow(type, parameters);
inst.Start();
        获取参数是在流程文件中建立相同名称的属性,流程中就可以得到这些参数:
private string m_EquipmentName = "";
public string EquipmentName
{
    
get return m_EquipmentName; }
    
set { m_EquipmentName = value; }
}

private int m_Numbers = 0;
public int Numbers
{
    
get return m_Numbers; }
    
set { m_Numbers = value; }
}

private float m_Moneys = 0;
public float Moneys
{
    
get return m_Moneys; }
    
set { m_Moneys = value; }
}

private string m_Desc = "";
public string Desc
{
    
get return m_Desc; }
    
set { m_Desc = value; }
}

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

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

public string OperatorName
{
get return _operatorName; }
set { _operatorName = value; }
}

}

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

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

public void JustApproveTheEquipmentApply(object o)
{
EquipmentApplyEventArgs args 
= o as EquipmentApplyEventArgs;
if (EquipmentApplyApproved != null)
EquipmentApplyApproved(
null, args);
else
{
System.Windows.Forms.MessageBox.Show(
"设备申请审批为空");
}

}

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

public void JustEscalateTheEquipmentApply(object o)
{
EquipmentApplyEventArgs args 
= o as EquipmentApplyEventArgs;
if (EquipmentApplyEscalated != null)
EquipmentApplyEscalated(
null, args);
else
{
System.Windows.Forms.MessageBox.Show(
"设备申请呈送上级领导为空");
}

}
IEquipmentApplyService
     }
      在初始化流程运行时的时候就可以把服务增加进来:
// 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
posted on 2007-02-01 19:07  RedStone  阅读(3525)  评论(1编辑  收藏  举报