创建一个基于状态的工作流.docx
- 文档编号:30461492
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:19
- 大小:416.97KB
创建一个基于状态的工作流.docx
《创建一个基于状态的工作流.docx》由会员分享,可在线阅读,更多相关《创建一个基于状态的工作流.docx(19页珍藏版)》请在冰豆网上搜索。
创建一个基于状态的工作流
创建一个基于状态的工作流
1.该SodaMachine应用程序再次为你提供了两个版本:
完整版本和非完整版本。
你需要下载本章源代码,打开SodaMachine文件夹中的解决方案。
2.当SodaMachine解决方案在VisualStudio中打开后,从VisualStudio的“生成”菜单中选择“生成解决方案”。
解决方案中的项目包含各种各样的依赖,编译该解决方案生成了那些关联的项目所能引用的程序集。
3.在VisualStudio的解决方案资源管理器窗口中找到SodaFlow项目中的Workflow1.cs文件。
然后在工作流视图设计器中打开该工作流准备编辑。
备注:
我已经创建了这个基本的工作流项目,因为该应用使用的CallExternalMethod和HandleExternalEvent活动的相关技术你在第8章和第10章中已经看过。
重复这些必须的步骤来创建这些常规活动没有任何必要,但是假如你从头开始创建工作流项目的话,你需要去做这些工作。
4.该工作流现由唯一的一个State活动组成。
选中该stateActivity1活动,把它重命名为“StartState”。
5.当创建工作流时,VisualStudio会为你自动添加一个原始的State活动。
但它也把这个活动作为起始(开始)活动。
当你在前一步骤中重命名该活动后,工作流就会丢失这个行为。
为把这个活动重新设置为起始活动,需要在工作流视图设计器的界面中点击除了State活动之外的其它任何地方,以便激活整个工作流的属性。
在属性面板中,你会看到一个InitialStateName属性,把它从stateActivity1改为StartState。
注意你可把这个值直接输入到该属性中也可从下拉列表框中选择StartState。
6.我们现在要把剩下的State活动拖拽到工作流视图设计器的界面上。
和你记得的一样,当SetState工作的时候,可方便地指定目标状态。
从VisualStudio的工具箱中拖拽一个State活动到设计器的界面上并把它放到StartState活动的旁边。
把它的名称改为WaitCoinsState。
7.拖拽另一个State活动到工作流视图设计器的界面上,把它的名称改为WaitSelectionState。
8.拖拽最后的一个State活动到工作流视图设计器的界面上,把它的名称改为EndState。
9.就像你要重新指定开始状态一样,你也需要告知WF结束状态是什么。
点击任何State活动外面的工作流视图设计器界面来激活该工作流的属性。
指定CompletedStateName属性为EndState。
然后VisualStudio会清空EndState的内容并改变它左上角的图标。
和前面一样,你可直接输入EndState也可从下拉列表框中选择它。
10.放好了这些状态活动,我们现在就来添加些细节。
从StartState开始,从工具箱中拖拽一个StateInitialization活动并把它放到StartState中。
11.双击你刚刚添加的这个stateInitialization1活动,这将进入到顺序工作流编辑器中。
12.从工具箱中拖拽一个Code活动到该StateInitialization活动中。
指定它的ExecuteCode方法为ResetTotal。
然后VisualStudio会为你添加对应的ResetTotal方法并为你切换到代码编辑视图下。
此时我们不准备添加代码,还是回到工作流视图设计器上来吧。
13.接下来拖拽一个SetState活动到设计器界面上,把它放到你刚刚添加的Code活动的下面。
14.指定该SetState的TargetStateName属性为WaitCoinsState。
15.回到工作流视图设计器的状态编辑器视图中,点击Workflow1左上角的超链接风格的按钮。
状态编辑器现在会显示出StartState向WaitCoinsState的转变。
16.StartState现在就完成了。
下一步我们将转到WaitCoinsState。
首先拖拽一个EventDriven活动到设计器的界面上并把它放到WaitCoinsState中。
在VisualStudio的属性面板中把它的Name属性修改为CoinInserted。
17.双击CoinInsertedEventDriven活动使顺序工作流编辑器呈现出来。
18.现在从工具箱中拖拽一个CoinInserted自定义活动到该EventDriven活动的表面上。
注意,假如你还没有编译整个解决方案的话,该CoinInserted事件是不会在工具箱中显示出来的。
假如你漏过了第2步,你可能必须移除该EventDriven活动以便成功地进行编译。
19.在工作流视图设计器中选中该ExternalEventHandlercoinInserted1活动,在属性面板中点击CoinValue属性以便激活浏览(...)按钮,然后点击该浏览按钮。
这将打开“将‘CoinValue’绑定到活动的属性”对话框。
点击“绑定到新成员”选项卡,在“新成员名称”中输入LastCoinDropped。
此时选中的应该是“创建属性”,假如不是的话选中它,以便你创建的是一个新的依赖属性。
然后点击“确定”。
20.现在我们需要做一个判断:
用户刚刚投入了足够的金钱来使那些饮料按钮处于可用(enable)状态吗?
为此,拖拽一个IfElse活动到工作流视图设计器界面上,把它放到CoinInsertedEventDriven活动中,它的位置在coinInserted1的下面。
21.选中ifElseActivity1的左边分支,以便在属性面板中显示它的属性。
对于它的Conditon属性,选择“代码条件”。
然后展开Condition节点,然后在Condition子属性中输入TestTotal。
在VisualStudio添加一个新的方法并为你切换到代码编辑视图后,重新返回到工作流视图设计器上来。
22.TestTotal将检测你最终投入到饮料机中的金额总计。
(我们将在添加代码前完成该工作流在工作流视图设计器中的设计工作,因为有一些我们需要的属性还没有创建。
)假如投入了足够的金钱,我们就需要转换到WaitSelectionState。
因此,拖拽一个SetState到该IfElse活动(ifElseBranchActivity1)的左边分支上,指定它的TargetStateName为WaitSelectionState。
23.假如TestTotal判定了没有足够的金额来买饮料,该工作流需要传达当前投入到饮料机中的钱的总计。
为此,从工具箱中拖拽一个UpdateTotal并把它放到该IfElse活动的右边分支中。
UpdateTotal是我为本任务创建的一个自定义的CallExternalMethod活动。
24.UpdateTotal需要一个要去通信的总计值,因此选中它的total属性并点击浏览(...)按钮,这将再次打开一个绑定对话框。
当绑定对话框打开后,选择“绑定到新成员”选项卡并在“新成员名称”中输入Total并确认选中的是“创建属性”选项。
然后点击“确定”。
25.点击左上角的超文本风格的Workflow1按钮回到状态设计器视图。
拖拽一个StateFinalization到工作流视图设计器的界面上,把它放到WaitCoinsState中。
26.双击你刚刚添加的stateFinalizationActivity1活动重新激活顺序设计器视图。
27。
从工具箱中拖拽一个ReadyToDispense并把它放到stateFinalizationActivity1中。
ReadyToDispense也是一个自定义的CallExternalMethod活动。
28.你刚刚添加的ReadyToDispense1活动将把最终的总计值返回给主应用程序。
为做这些,它需要访问你在第14步中添加的Total属性。
看看readyToDispense1的属性,点击finalTotal属性,然后点击在finalTotal中激活的浏览(...)按钮。
点击浏览按钮打开绑定对话框,但是这次是“绑定到现有成员”。
从列表中选择Total属性然后点击“确定”。
29.点击超文本风格的Workflow1按钮回到状态设计器视图上来。
这里,从工具箱中选择EventDriven活动并把它放到设计器界面上的WaitSelectionState活动中。
把它命名为ItemSelected。
30.双击ItemSelectedEventDriven活动进入顺序设计器视图。
31.拖拽一个自定义ExternalEventHandler的活动ItemSelected,把它放进ItemSelectedEventDriven活动中。
32.用户挑选了饮料后,主应用程序触发该ItemSelected事件。
当该事件发生的时候,我们需要切换到EndState。
为此,我们需要添加SetState活动。
因此从工具箱中拖拽一个SetState并把它放到ItemSelectedEventDriven活动中的itemSelected1的下面。
指定它的TargetStateName为EndState。
33.点击超文本风格按钮Workflow1回到状态设计器视图上来。
34.从工作流视图设计器的角度来看,该工作流就完成了,但我们还要写一些代码。
在VisualStudio的解决方案管理器中选择Workflow1.cs文件,然后在代码编辑模式下打开该文件准备进行编辑。
35.查看Workflow1.cs源文件,找到你在第12步所添加的ResetTotal方法。
把下面的代码插入到ResetTotal方法中:
//Startwithnototal.
Total=0.0m;
36.最后,找到你在第21步所添加的TestTotal方法。
为该方法添加下面这些代码:
//Addthelastcoindroppedtothetotalandcheck
//toseeifthetotalexceeds1.25.
Total+=LastCoinDropped;
e.Result=Total>=1.25m;
37.编译整个解决方案。
修正任何可能出现的编译错误。
现在你可按下F5或Ctrl+F5运行该应用程序。
点击一个投币按钮,LCD上显示的总金额更新了吗?
当你投入了足够的金钱时,你能挑选饮料吗?
备注:
假如该应用程序由于InvalidOperationException异常崩溃的话,最可能的情况是由于引用在解决方案第一次完成编译后没有被完全更新。
可简单地重新编译整个应用程序(重复第37步)并再次运行该应用程序,它应该能干净利落地运行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 创建 一个 基于 状态 工作流