DelayActivity,ListenActivity,CallExternalMethodActivity,HandleExternalEventActivity实现申请,审批,超时否决的演示
使用Winform作为客户端
使用WCF作为客户端与服务器的通信方式
代码很短,很适合正在学习WF,并想快速将WF应用到商业开发的人
例子是在Windwos server 2008 ,VS2008 ,NET3.5下写的
下载 http://files.cnblogs.com/foundation/wxwinter3.rar
应用场景说明:
![](https://i-blog.csdnimg.cn/blog_migrate/e5fd06d2b6badc5170bc138e7e4995c5.jpeg)
流程设计
![](https://i-blog.csdnimg.cn/blog_migrate/06a413d3208ca83ed7c8b5efe64bde0c.jpeg)
使用说明
1.启动引擎服务
![](https://i-blog.csdnimg.cn/blog_migrate/d2a1e5e9c01eb120673367398bc5d0da.jpeg)
2.客户端提交申请
![](https://i-blog.csdnimg.cn/blog_migrate/42eb0c023ecf17bc1cba6911b7acd13b.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/2df55a0b1444d648541152552217abee.jpeg)
3.审批者登录
![](https://i-blog.csdnimg.cn/blog_migrate/e059317aa3b69d4855819f72e2bdd91c.jpeg)
4.审批者审批
![](https://i-blog.csdnimg.cn/blog_migrate/fcbb333498e14f31d0b38b746ce9ef9f.jpeg)
5.申请者查看审批结果
![](https://i-blog.csdnimg.cn/blog_migrate/1bf079d7699c511c1ef0cdeef27cc96b.jpeg)
引擎服务的全部代码
namespace
WorkflowConsoleApplication2
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
class Program
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
static void Main(string[] args)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DataSet1 ds = new DataSet1();
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
ExternalDataExchangeService exchange = new ExternalDataExchangeService();
workflowRuntime.AddService(exchange);
exchangeEvent obj = new exchangeEvent(ds);
exchange.AddService(obj);
control ctrl = new control(workflowRuntime, obj);
string WCFurl = "http://localhost:567/wxwinter/";
ServiceHost host = new ServiceHost(ctrl, new Uri(WCFurl));
string WCFClassName = "wxdTest";
host.AddServiceEndpoint(typeof(Icontrol), new BasicHttpBinding(), WCFClassName);
host.Open();
Console.WriteLine("引擎已启动");
Console.Read();
}
}
![](/Images/OutliningIndicators/InBlock.gif)
class exchangeEvent : IExternalEvent
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
DataSet1 ds;
public exchangeEvent(DataSet1 v)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ds = v;}
public event EventHandler<NextStepEventArgs> ApproveEvent;
![](/Images/OutliningIndicators/InBlock.gif)
public void Approve(string gid, string userResult)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Guid guid = new Guid(gid);
NextStepEventArgs e = new NextStepEventArgs(guid);
e.result = userResult;
ApproveEvent(null, e);
}
![](/Images/OutliningIndicators/InBlock.gif)
public System.Data.DataSet GetApproverTask(string username)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
System.Data.DataView dv = new System.Data.DataView(ds.infoTab);
dv.RowFilter = string.Format("[approver]='{0}' and [state] = 1", username);
System.Data.DataSet temp = new System.Data.DataSet();
temp.Tables.Add(dv.ToTable());
return temp;
}
![](/Images/OutliningIndicators/InBlock.gif)
public System.Data.DataSet GetProposerTask(string username)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
System.Data.DataView dv = new System.Data.DataView(ds.infoTab);
dv.RowFilter = string.Format("[proposer]='{0}'", username);
System.Data.DataSet temp = new System.Data.DataSet();
temp.Tables.Add(dv.ToTable());
return temp;
}
public void Notify(dataform df)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
System.Data.DataView dv = new System.Data.DataView(ds.infoTab);
dv.RowFilter = string.Format("[guid]='{0}'", df.guid);
switch (df.state)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
case 1:
DataSet1.infoTabRow r = ds.infoTab.NewinfoTabRow();
r.guid = df.guid;
r.approver = df.approver;
r.content = df.content;
r.proposer = df.proposer;
r.result = df.result;
r.state = df.state;
ds.infoTab.Rows.Add(r);
break;
case 2:
((DataSet1.infoTabRow)dv[0].Row).state = df.state;
((DataSet1.infoTabRow)dv[0].Row).result = df.result;
![](/Images/OutliningIndicators/InBlock.gif)
break;
case 3 :
![](/Images/OutliningIndicators/InBlock.gif)
((DataSet1.infoTabRow)dv[0].Row).state = df.state;
break ;
}
}
}
![](/Images/OutliningIndicators/InBlock.gif)
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
class control : Icontrol
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
WorkflowRuntime workflowRuntime;
exchangeEvent obj;
public control(WorkflowRuntime r, exchangeEvent o)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
workflowRuntime = r;
obj = o;
}
public void begingWF(string proposer, string approver, string content)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Dictionary<string, object> dc = new Dictionary<string, object>();
dataform df = new dataform();
df.approver = approver;
df.content = content;
df.proposer = proposer;
df.result = "";
dc.Add("DF", df);
WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1), dc);
instance.Start();
}
![](/Images/OutliningIndicators/InBlock.gif)
public void Approve(string guid, string result)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{obj.Approve(guid, result);}
![](/Images/OutliningIndicators/InBlock.gif)
public System.Data.DataSet GetApproverTask(string username)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ return obj.GetApproverTask(username);}
![](/Images/OutliningIndicators/InBlock.gif)
public System.Data.DataSet GetProposerTask(string username)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ return obj.GetProposerTask(username);}
}
![](/Images/OutliningIndicators/InBlock.gif)
[ServiceContract]
public interface Icontrol
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
[OperationContract]
void Approve(string guid, string result);
[OperationContract]
void begingWF(string proposer, string approver, string content);
[OperationContract]
System.Data.DataSet GetApproverTask(string username);
[OperationContract]
System.Data.DataSet GetProposerTask(string username);
}
}
补充一点,对于流程结节的控制,我更喜欢用规则实现,具体见
规则引擎 http://www.cnblogs.com/foundation/archive/2007/08/18/860911.html
这个例子