Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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.