.NET Framework 4.6.1 提供了多个用于创建自定义活动的选项。 用于创作给定活动的正确方法取决于需要哪些运行时功能。
确定用于创作自定义活动的基活动类
下表列出了自定义活动基类中可用的功能。
| 基活动类 | 可用的功能 |
|---|---|
| Activity | 将系统提供的和自定义活动的组组合到复合活动中。 |
| CodeActivity | 通过提供 Execute 可重写的方法来实现命令性功能。 还提供对跟踪、变量和参数的访问权限。 |
| NativeActivity | 提供所有功能 CodeActivity,以及中止活动执行、取消子活动执行、使用书签以及计划活动、活动作和函数的功能。 |
| DynamicActivity | 提供类似于 DOM 的方法,用于构建与 WF 设计器和运行时机制 ICustomTypeDescriptor进行交互的活动,从而允许在不定义新类型的情况下创建新活动。 |
使用活动创作活动
通过组合其他现有活动从 Activity 撰写功能派生的活动。 这些活动可以是 .NET Framework 4.6.1 活动库中的现有自定义活动和活动。 组装这些活动是创建自定义功能的最基本方法。 使用可视化设计环境创作工作流时,通常采用此方法。
使用 CodeActivity 或 AsyncCodeActivity 创作活动
派 CodeActivity 生或 AsyncCodeActivity 可以通过使用自定义命令性代码替代 Execute 方法来实现命令性功能的活动。 当活动由运行时执行时,将执行自定义代码。 虽然以这种方式创建的活动有权访问自定义功能,但它们无权访问运行时的所有功能,例如完全访问执行环境、计划子活动、书签创建或对 Cancel 或 Abort 方法的支持。 CodeActivity执行时,它有权访问减少的执行环境版本(通过CodeActivityContext或AsyncCodeActivityContext类)。 使用创建 CodeActivity 的活动有权访问参数和变量解析、扩展和跟踪。 异步活动计划可以使用 AsyncCodeActivity。
使用 NativeActivity 创作活动
派生自NativeActivity的活动(如派生CodeActivity自的活动)通过重写Execute来创建命令性功能,但也可通过传递到Execute方法访问工作流运行时NativeActivityContext的所有功能。 此上下文支持计划和取消子活动、执行 ActivityAction 和 ActivityFunc<TResult> 对象、将事务流入工作流、调用异步进程、取消和中止执行、访问执行属性和扩展以及书签(恢复暂停工作流的句柄)。
使用 DynamicActivity 创作活动
与其他三种类型的活动不同,新功能不是通过派生新类型DynamicActivity(类是密封的),而是通过使用活动文档对象模型(DOM)将功能组装到属性Implementation中Properties来创建。
创作返回结果的活动
许多活动在执行后必须返回结果。 尽管始终可以为此对活动定义自定义OutArgument<T>,但建议改为使用Activity<TResult>或派生自或NativeActivity<TResult>派CodeActivity<TResult>生。 每个基类都有一个 OutArgument<T> 命名的 Result,活动可用于其返回值。 仅当仅需要从活动返回一个结果时,才应使用返回结果的活动;如果需要返回多个结果,则应改用单独的 OutArgument<T> 成员。