星宿.net

星星的随笔

博客园 首页 新随笔 联系 订阅 管理
  31 Posts :: 0 Stories :: 235 Comments :: 16 Trackbacks

 

上一节我们学习了怎样通过参数传递数据,这节我们就说说通过事件传递数据的方法,由于这节除了我们自己写的一部分代码外,还需要用到另外需要触发事件的ExpenseApplication外部应用程序和所用事件示例代码,所以请下载示例程序源代码,根据需要添加项目的引用。

另外,我们将学习到怎样使用if/else 根据条件处理工作流 ,还将学习根据定制活动有条件的处理工作流。我们将在制作一个简单的处理费用支出报表的工作流中学习到这些概念。当工作流在报表数据提交的时候将接收到一个事件,这个事件的参数将把包含实际的费用支出报表数据提交到进程。如果报表的支出费用少于1000,工作流将自动提交,否则,将自动拒绝。

首先,创建一个名称为ExpenseWorkflows的空工作流项目。

添加一个含有单独代码的顺序工作流。默认名称就叫Workflow1.xoml

我们将使用HandleExternalEventCallExternalMethod 这两个活动来和支出报表建立联系,在这之前,先给我们的解决方案添加一个现有项目ExpenseLocalServices(从下载的源代码中可以找到这个项目),然后给我们的项目ExpenseWorkflows添加一个引用,引用这个现有项目。

添加提交支出报表的活动

1. 在Workflow1这个类中我们需要添加两个成员变量供将来使用,一个变量名称为reportArgs,用于接收报表提交这个事件的参数对象。另外一个变量将保存报表的支出费用。

(Snippet: Lab01_Ex03_Task03_MemberVariables)

public partial class Workflow1 : SequentialWorkflowActivity

{

public ExpenseLocalServices.ExpenseReportSubmittedEventArgs reportArgs =

default(ExpenseLocalServices.ExpenseReportSubmittedEventArgs);

public int amount = default(System.Int32);

}

2. 打开workflow1.xoml的设计视图。

3. 从工具箱中找到HandleExternalEvent 这个活动拖拽到我们的工作流设计视图中,将其Name属性设置为expenseReportSubmitted1如图:

Ex3Task3Sequence

4. 点击红色的叹号选择Property ‘InterfaceType’ is not set.来设置InterfaceType属性。

Ex3Task3WarningSelection

5. 点击[…]按钮将出现 .NET Type Browser 对话框。从引用程序集目录树中选择 ExpenseLocalServices.IExpenseService 。如下图所示:

6.现在我们的工作流设计视图expenseReportSubmitted1上还有一个叹号,是因为我们的EventName还没有设置。同样点选它,设置EventName属性。点击下拉列表框,选择ExpenseReportSubmitted。

7.继续设置expenseReportSubmitted1的属性,找到e这个属性,点[…]按钮,选择Bind to an existing member选项卡下的Workflow1---reportArgs.也就是把这个提交事件的e参数和我们定义的成员变量reportArgs绑定。

8.双击设计视图中的expenseReportSubmitted1创建Invoked事件。

(Snippet: Lab01_Ex03_Task03_ReportSubmittedInvoked)

public void ReportSubmitted_Invoked(object sender, EventArgs e)

{

Console.WriteLine("ReportSubmitted_Invoked");

//给我们的成员变量amount设置事件触发得到的值

this.amount = this.reportArgs.Report.Amount;

}

添加自动审批活动到我们的工作流

1. 我们将添加一个定制活动(我们还没学到怎么定制活动,所以先直接引用做好的定制活动吧,在下载的源代码里的ExpenseActivities,可以看一下,其实很容易理解,就象我们做定制控件。:))来判断所做的提交是否进行自动审批。

2. 单击工具|选择工具箱项

3. 选择 .NET Framework组件 选项卡并单击浏览

4. 导航到我们代码源文件的ExpenseWorkflows\ExpenseActivities\bin\Debug\ExpenseActivities.dll.将其添加。

5. 现在我们的工具箱会多一个新的选项卡叫做ExpenseActivities,里面有两个新的活动:AutoApproveGetManager

6. 现在把我们把一个新的定制活动AutoApprove拖拽到我们的工作流设计视图。

7. 现在我们的工作流设计视图有两个活动,如图:

8. 在设计视图中选择活动autoApprove1 ,设置其Amount属性,绑定到Workflow1.amount

给工作流添加条件

1. 从工具箱中找到IfElse活动拖拽到设计视图中autoApprove1的下面。

2. 将其(Name)属性设置为EvaluateExpenseReport

3. 选择IfElse左边活动分支设置:(Name属性设置为IfAutoApproveReport;Condition属性设置为Declaritive Rule Condition

4. 展开Condition的“+”,设置其中的ConditionName属性为AutoApproveCondition

5. 对Expression属性编辑表达式:this.autoApprove1.Approved。如图:

Ex3AutoApprovedCondition

6. 选择EvaluateExpenseReport右边的活动分支将其(Name)属性改为ElseRejected.

给支出报表是否通过添加逻辑判断

1. 从工具箱中选择CallExternalMethod活动添加到标签为IfAutoApproveReport的条件分支里面,设置这个活动(Name)属性为approveExpenseReport1

2. 象上面我们设置HandleExternalEvent活动时一样,我们把InterfaceType属性按照相同的方法设置成ExpenseLocalService.IExpenseService

3. MethodName属性选择下拉列表框中的ApproveExpenseReport方法。

4. 同样的,我们还要设置properties属性,选择report,设置如下所示:

5. 现在,左边的IfAutoApproveReport条件分支我们配置完毕了。接下来配置右边的条件分支ElseRejected

6. 添加另一个CallExternalMethod活动到ElseRejected,设置Name属性为rejectExpenseReport1

7. 选择InterfaceType属性设置为:ExpenseLocalService.IExpenseService

8. 选择MethodName属性设置为:RejectExpenseReport

9. 选择Report属性绑定到:reportArgs.Report.

10. 现在我们的工作流设计视图如图所示:

调试工作流

到现在,我们的工作流就做完了。接下来我们要调试它,看他的执行过程。

不过,这里我们还需要借助两个项目,来触发我们所做的工作流事件。

1.进入ExpenseWorkflows\ExpenseHost\bin\Debug目录,复制ExpenseHost.exeExpenseHost.exe.config到我们的项目文件目录:ExpenseWorkflows\ExpenseWorkflows\bin\Debug。

还有ExpenseWorkflows\ExpenseApplication\这个项目(一会调试用)。

2. 现在需要配置我们的ExpenseWorkflows项目,将其设置为启动项目,然后右击项目选择属性,选择调试,在启动操作选择“启动外部程序”,浏览到ExpenseWorkflows\ExpenseWorkflows\bin\Debug\ExpenseHost.exe

3. 现在可以按F5启动调试了,当然,为了看整个项目的执行过程,我们可以给各个工作流和其他感兴趣的位置设置断点来详细学习工作流的执行过程。

Task 7 – Test the Expense Reporting Workflow

测试支出报表工作流

1. Compile and run the ExpenseWorkflows project under the Visual Studio debugger by pressing F5 or selecting the Debug | Start Debugging menu command.

2. 点F5启动调试,将显示如下界面,执行ExpenseHost命令行程序。

4. 运行 ExpenseApplication.exe (在如下目录:ExpenseWorkflows\ExpenseApplication\bin\Debug)。

我们提交一条报表数据,金额填写了1500,

5. 在VS2005给活动 expenseReportSubmitted1设置断点

6. 然后单步执行可以看到 ReportSubmitted_Invoked 事件处理的代码.

7. 继续单步执行到活动 rejectExpenseReport1

8. 看到我们的支出报表请求被拒绝了,这里会调用方法我们设置的RejectExpenseReport来更新刚才我们的那条report记录,将起状态设置为拒绝。

9. 我们可以看到应用程序状态

10. 点击Refresh Reports 

 变成了拒绝(Rejected)。

11. 如果输入小于1000的数,会看到

12. 状态为通过。

 

大家可以仔细阅读一下这些项目的代码,然后调试一遍,应该就能了解其中工作的过程和工作流中HandleExternalEventActivity和CallExternalMethodActivity的使用方法了。

posted on 2007-01-24 17:52 星宿.NET 阅读(5035) 评论(24)  编辑 收藏 网摘 所属分类: WinFX

Feedback

#1楼  2007-01-24 17:58 亚历山大同志      
支持!
  回复  引用  查看    

#2楼  2007-01-25 08:31 兰亭      
非常好,辛苦了
  回复  引用  查看    

#3楼  2007-01-25 08:59 努力学习的熊      
大哥,这个Hands On Lab请你标一下是哪个版本吧,不同版本中的各个类是不太一样地。而且好像还没出正式版的Hands On Lab。如果有请提供一下地址,多谢:)
  回复  引用  查看    

#4楼  2007-01-25 09:15 风生水起      
辛苦了
  回复  引用  查看    

#5楼 [楼主] 2007-01-25 09:28 星宿.NET      
@努力学习的熊
http://www.microsoft.com/downloads/details.aspx?FamilyID=2e575633-e357-4ee7-aaff-34138f00e830&DisplayLang=en
貌似是RC版的
  回复  引用  查看    

#6楼  2007-01-25 18:20 zack      
下载源代码中没有ExpenseReporting项目。楼主重发一下吧。
  回复  引用  查看    

#7楼 [楼主] 2007-01-25 20:30 星宿.NET      
@zack
sorry,我写错名字了,应该是ExpenseLocalServices,已经修改,代码没有问题
  回复  引用  查看    

#8楼  2007-01-26 11:05 蓝狐      
加油吧,一起学习!我前段时间已经将Hand On Lab01中的练习做完了,做到Lab02的时候发现没有人往下去研究,就又放下了一段时间!看到现在又有这么多人热情很高,我打算继续努力,我会关注楼主的!同勉共进!
  回复  引用  查看    

#9楼 [楼主] 2007-01-26 11:15 星宿.NET      
@蓝狐
:)
谢谢支持
  回复  引用  查看    

#10楼  2007-01-26 11:51 蓝狐      
请教一个问题:
用WWF做工作流,如何实现Web表单的流转,要求表单自定义设计与工作流代码分离,即可以灵活自由的修改表单而不影响流程,也可以一个多个表单绑定一个流程.这样表单设计或调整可由用户完成.不知楼主及各位朋友有没有进行过这方面的研究,希望做过的都来积极讨论,不吝赐教!
  回复  引用  查看    

#11楼  2007-03-22 16:17 cjc [未注册用户]
兄弟,干的不错,共享精神值得学习:)
  回复  引用    

#12楼  2007-04-17 11:22 mliu [未注册用户]
楼主,你提供的ExpenseWorkflows\ExpenseApplication\bin\Debug\ExpenseApplication.exe程序有问题了,报System.Net.Sockets.SocketException: 由于目标机器积极拒绝,无法连接。
  回复  引用    

#13楼  2007-04-18 10:25 mliu [未注册用户]
通过楼主的提示,发现是原程序的外部启动程序位置出错了,通过重新指定到本机的正常位置,以上问题就不存在了.
  回复  引用    

#14楼  2007-05-13 06:49 C# [未注册用户]
好文章
學習了
  回复  引用    

#15楼  2007-08-03 12:00 小宝 [未注册用户]
您文中说到"先给我们的解决方案添加一个现有项目ExpenseLocalServices(从下载的源代码中可以找到这个项目"是不是把下的那个代码中的ExpenseLocalServices文件夹添加到解决方案中去?我怎么加不去?我是刚接触这东西,问题太菜请多谅解?
  回复  引用    

#16楼  2007-09-11 08:59 蓝枫 [未注册用户]
楼主辛苦了啊!
  回复  引用    

13楼,麻烦把问题说清楚一点,是怎么解决的?我也遇到这样的问题了。但是还没有解决。谢谢了
  回复  引用    

#18楼  2008-01-31 18:01 曹海良 [未注册用户]
点击[…]按钮将出现 .NET Type Browser 对话框。从引用程序集目录树中选择 ExpenseLocalServices.IExpenseService 。

怎么我点了一下里面没有东西啊

  回复  引用    

#19楼  2008-03-04 18:21 kers [未注册用户]
@曹海良
我也遇到了同样的问题! 请高手们提示一下..谢谢
  回复  引用    

#20楼  2008-03-04 18:44 kers [未注册用户]
@曹海良
好像是版本问题吧,晕~ 我这.net 是3.0的
  回复  引用    

#21楼  2008-03-04 18:58 kers [未注册用户]
@曹海良
解决了,直接用dll引用就可以.
  回复  引用    

#22楼  2008-04-01 13:33 funs [未注册用户]
{"由于目标机器积极拒绝,无法连接。 127.0.0.1:8085"}


  回复  引用    

#23楼  2008-06-17 22:57 小屁股 [未注册用户]
请问为什么不管我输入什么值
this.autoApprove1.Approved 都是等于true

这是为什么

我一定要在条件里把教程中的this.autoApprove1.Approved

改成 this.amount < 1000 才可以正常走下去

不过经过跟踪,即使状态为reject的时候this.autoApprove1.Approved的值仍然为true

不知道是不是这个控件错误,还是我没配置好,还是什么,请指教
  回复  引用    

#24楼  2008-06-29 22:55 poplau      
请问为什么不管我输入什么值
this.autoApprove1.Approved 都是等于true

这是为什么

我一定要在条件里把教程中的this.autoApprove1.Approved

改成 this.amount < 1000 才可以正常走下去

不过经过跟踪,即使状态为reject的时候this.autoApprove1.Approved的值仍然为true

不知道是不是这个控件错误,还是我没配置好,还是什么,请指教
/////////////////////////////
要设置 autoApprove1 属性中的 Amount为Activity=Workflow1, Path=reportArgs.Report.Amount

不然默认值为0,总是<1000的

  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-01-26 17:09 编辑过
Google站内搜索

相关文章:

相关链接: