Executando um Workflow criado com XML no WF3

Olá pessoal,

Tenho encontrado por aí várias pessoas com dúvidas sobre a execução de Workflows criados somente com XML, sem code-beside. Por isso resolvi escrever este post fazendo uma demonstração simples de como isso pode ser feito.

1o passo: Criar uma solução com um WF e uma atividade customizada (WF só com BAL não tem graça), conforme print abaixo.

image

2o passo: Criar uma atividade customizada, como no exemplo abaixo.

    1:  public partial class WriteLineActivity : System.Workflow.ComponentModel.Activity
    2:  {
    3:      public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(WriteLineActivity));
    4:   
    5:      [DescriptionAttribute("Text")]
    6:      [CategoryAttribute("Text Category")]
    7:      [BrowsableAttribute(true)]
    8:      [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
    9:      public string Text
   10:      {
   11:          get
   12:          {
   13:              return ((string)(base.GetValue(WriteLineActivity.TextProperty)));
   14:          }
   15:          set
   16:          {
   17:              base.SetValue(WriteLineActivity.TextProperty, value);
   18:          }
   19:      }
   20:   
   21:      public WriteLineActivity()
   22:      {
   23:          InitializeComponent();
   24:      }
   25:   
   26:      protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
   27:      {
   28:          Console.WriteLine(Text);
   29:          return ActivityExecutionStatus.Closed;
   30:      }
   31:  }

3o passo: Criar um workflow utilizando XML

    1:  <SequentialWorkflowActivity x:Name="MyXMLWorkflow" xmlns:ns0="clr-namespace:ActivityLibrary1;Assembly=ActivityLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" xmlns="https://schemas.microsoft.com/winfx/2006/xaml/workflow">
    2:      <ns0:WriteLineActivity Text="Hello" x:Name="Activity1" />
    3:      <ns0:WriteLineActivity Text="World" x:Name="writeLineActivity1" />
    4:  </SequentialWorkflowActivity>

4o passo: Criar e executar o Workflow através de um XmlTextReader

    1:  WorkflowRuntime workflowRuntime = new WorkflowRuntime();
    2:   
    3:  TypeProvider provider = new TypeProvider(workflowRuntime);                
    4:  provider.AddAssemblyReference("..\\..\\..\\ActivityLibrary1\\bin\\Debug\\ActivityLibrary1.dll");
    5:  workflowRuntime.AddService(provider);
    6:   
    7:  WorkflowInstance instance = workflowRuntime.CreateWorkflow(XmlTextReader.Create("MyXmlWorkflow.xml"));
    8:  instance.Start();

Notem o uso da classe TypeProvider, ela indica para o Workflow como carregar as referências dos Assemblies de atividades customizadas.

O código do exemplo pode ser encontrado aqui.