Compiling Workflows

Scott Allen pointed out that if you need to declare top level properties in a XAML only workflow, you can subclass the root activity class, add the properties you want, then specify the custom subclass in the XAML workflow. That doesn’t really solve my problem. I’m trying to limit to activity vocabulary that the workflow author has access to. If they can specify their own custom type as the root activity of their workflow, they can also add whatever execution logic they want, which is what I’m trying to avoid.

There is an example in the Advanced Authoring chapter of Essential WF where they describe building a root activity class that generate top level properties as part of the workflow compilation process. The root activity (in the example, it’s called "SequenceWithVars") where you can specify the top level parameters in the XAML. Here’s an example from the book:

<SequenceWithVars x:Class="Workflow1" xmlns="..." xmlns:x="...">

The SequenceWithVars type includes a custom ActivityCodeGenerator that loops thru the VariableDecls collection and adds a top-level property (via CodeDOM) for each VariableDecl instance. You end up with a workflow class that looks like this:

public partial class Workflow1 : SequenceWithVars
{
 public static DependencyProperty OrderProcConversationProp =
 DependencyProperty.Register("OrderProcConversation",
 typeof(Guid), typeof(Workflow1));
 public Guid OrderProcConversation
 {
 get
 {
 return (Guid)base.GetValue(Workflow1.OrderProcConversationProp);
 }
 set
 {
 base.SetValue(Workflow1.OrderProcConversationProp, value);
 }
 }
 //Remaining WF type declaration goes here
}

In order to use the XAML workflow with the SequenceWithVars activity, you do need to compile the XAML first using the WorkflowCompiler class. WorkflowCompiler.Compile() returns a compiled type which can then be passed to CreateWorkflow. But adding the separate compile step is a small price to pay, in my opinion. This approach lets me limit the workflows to XAML only while still allowing for top level properties which are needed in many data binding scenarios.

This entry was posted by DevHawk on January 29, 2007. It was tagged WF.

Comments:

if(this comment has anything interesting) { you should read it } else { it is just a waste of time }
This comment was posted by Some crazy guy on February 02, 2007 at 11:12 AM.

Disclaimer

The information in this weblog is provided "AS IS" with no warranties, and confers no rights. This weblog does not represent the thoughts, intentions, plans or strategies of my employer. It is solely my opinion. Inappropriate comments will be deleted at the authors discretion.

AltStyle によって変換されたページ (->オリジナル) /