昨天刚从M$网站下载了WF HOL(RC),因为园子里已有兄弟翻译了HOL01(请参考这里),所以这里就不再赘述了,直接进入第二部分(Creating Custom Activties),如果在看的过程中有什么概念不理解的话,请自行参考HOL第一部分以及ReadMe部分(原文在此)
活动(Activities)是工作流模型的动作执行,重用,是一个组成部分。基本活动是工作流中的一系列步骤,组合活动也能包括其他活动。....(m$广告)+开发人员也能创建自己的活动,并出现在VS2005工具栏中,跟基本活动库有一样的效果。
活动是一系列类,并且你也能定义属性,方法和事件以被工作流中引用。
该Lab的目的是展示怎样在WF中创建自定义的活动。同时,可以学到怎样暴露活动中的属性(刚才说了活动就是一系列类,所以有属性这一说法),怎样在运行时访问属性值。
课时分四部分:
1)利用VS内建的活动设计器创建组合活动
2)创建一个基类活动用来发送邮件(需要配置SMTP)
3)在工作流中加入验证组件以验证邮件参数
4)学习怎样添加一个自定义活动设计器到我们自己的基类活动中,以提供一个自定义接口
第一课 使用活动设计器创建组合活动(creating a composite activity using the activity designer)
学习怎样创建由两部分分离的代码活动组成一个新的活动
任务一: 创建一个新的工作流项目
1.(打开VS2005....),使用Sequential Workflow Console Application模版建立一个新的工作流宿主程序(host),键入CompositeActivitySample
1.1等候若干秒,项目创建完毕
2.在Program.cs中包含一堆XXX的代码(m$都说它是八股文?),略过 ...
2.1将Workflow1.cs更名为HelloWorldWorkflow.cs
现在你已经有了一个工作流项目,下一步是要添加一个活动项目到解决方案中。一旦你创建了一个活动项目,同时就添加了两端活动代码。活动代码会顺序着执行,表示着一个业务过程的执行。总体上来说,也就是说有两种类型的活动:
i.基类的
ii.组合的
也就是说,既可以通过从基类,也能通过组合来创建新活动。
现在,创建一个新项目,选择Workflow Activity Library模版,重命名为HelloWorldActivityLibrary,VS创建了一个活动库项目,包含一个活动,名称为Activity1.cs,重命名其为HelloWorldActivity.cs。
1.双击打开该视图,同时从工具栏中拽进来一个Code活动
2.属性框中改其name为writeHello(m$不遵守FCL代码规范协议吗?)
3.双击该活动,以查看writeHello_ExecuteCode方法
4.键入Console.WriteLine("Hello,Michael");//开玩笑了
代码差不多应该是这样
OK,现在我们可以编译它了。
编译完之后,就可以在工具箱里看到HelloWorldActivity了(就等同于做一个UserControl这么简单)
现在就可以把该“控件”拽到视图中,然后改一下它的默认name属性,编译,在控制台中就可以看到如下输出:
Hello,Michael
Press any key to continue...
第二课 创建基类活动(Creating a basic activity)
这课中,我们来创建一个工作流项目,其中包含一个自定义属性的活动。属性用做email消息规范之用。我们将给基类活动创建一个执行组件,该组件使用.net API和刚才的属性域发送email消息。
Task1
1.创建新项目,选择Sequential Workflow Console Application模版
2.重命名项目名为CustomPropertySample
3.重命名Workflow1.cs为SendMailWorkflow.cs
Task2
1.创建新活动项目,选择Workflow Activity Library模版
2.重命名为SendMailActivityLibrary
3.重命名Activity1.cs为SendMailActivity.cs
4.选择SendMailActivity.cs设计视图属性,选择Base Class,出现Browse and Select a .NET Type对话框,选择System.Workflow.ComponentModel标签,以选择一个基类,出现两个选项Activity和Composite Activity
5.选择Activity,OK完之后,查看其代码视图
6.在构造函数中插入代码片段Workflow->DependencyProperty - Property
下表中是可以添加到属性中的值
|
Name |
Type |
Description |
|
Browseable |
Boolean |
Indicates whether this property appears in the Properties window. |
|
Category |
String |
A user-defined category for the property. |
|
Description |
String |
A description for the property. |
|
DesignerSerializationVisibility |
Visible, Hidden, or Content |
Determines how and if properties will be serialized. Visible (the default) – the property will be serialized normally. Hidden – prevents property serialization Content – used for collection properties. The collection object itself is not serialized, however the contents of the collection are. If a developer chooses a collection type, this property will be set to Content. If a developer chooses a non-serializable type, this property will be set to Hidden. |
|
ValidationVisibility |
Optional, Required, or Hidden |
Specifies how the property’s value is validated. Optional (the default) – the property can accept null values. Required – The property must be set to a non-null value and is checked to ensure that this is the case. Hidden – There is no automatic validation of the property’s value. If ValidationVisibility is set to ‘Required,’ when the component is reused, it will require the property to be configured via smart tags, obviating the need for a check in the activity’s Validator class. |
添加一堆代码之后,大体上像下面这样
同样,再添加下面三个方法:
i.From
ii.Subject
iii.Body
现在,编译,在工具箱中可以看到SendMailActivity,拽其到设计视图中之后,查看其属性,就可以看到刚才我么自定义的几个属性:To/From/Subject/Body,同时我们就可以在其中填入我们需要的值。
下一步,查看其代码视图,重载其Execute方法,代码如下
编译完之后,就可以在c:\inetpub\mailroot\drop看到一份新邮件了,OK!
第三课 添加邮件参数验证器
//待续