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.
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.