W jednym z ostatnich postów pokazałem jak stworzyć aplikację WWF na przykładzie prostego Sequential Workflow. Dzisiaj zajmiemy się wykorzystaniem stworzonej biblioteki w aplikacji klienckiej. Warto najpierw ściągnąć kompletny kod źródłowy ponieważ nastąpiła jedna drobna zmiana w implementacji workflow.
Pierwszym etapem jest oczywiście stworzenie aplikacji np. WPF lub Connsole. Następnie należy dodać referencje do skompilowanej biblioteki zawierającej WWF. Ponadto jest jeszcze potrzebna biblioteka System.Workflow.Runtime, System.Workflow.ComponentModel oraz System.Workflow.Activities.
W celu odpalenia workflow trzeba najpierw stworzyć tzw. środowisko uruchomieniowe:
System.Workflow.Runtime.WorkflowRuntime runtime = new System.Workflow.Runtime.WorkflowRuntime(); runtime.StartRuntime();
W poprzednim poście został zdefiniowany specjalny interfejs dla usługi:
[ExternalDataExchange] public interface IService { void NotifyUser(string message); void Approve(); }
Przykładowa implementacja usługi może wyglądać następująco:
class Service:SimpleWorkflowLibrary.IService { private Guid m_InstanceId; public Service(Guid instanceId) { m_InstanceId = instanceId; } #region IService Members void SimpleWorkflowLibrary.IService.NotifyUser(string message) { Console.WriteLine(message); } void SimpleWorkflowLibrary.IService.Approve() { // tutaj powinien znajdować się kod walidacyjny } #endregion }
Usługa służy do komunikacji między workflow a aplikacją kliencką. Przykładowo stworzony workflow wywołuje metodę NotifyUser (powiadomienie użytkownika) oraz Approve (przeprowadzenie walidacji).
Kolejnym krokiem jest inicjalizacja workflow, przekazanie niezbędnych parametrów oraz dodanie stworzonej usługi:
Dictionary<string, object> parameters = new Dictionary<string, object>(); parameters.Add("Number", number); System.Workflow.Runtime.WorkflowInstance instance= runtime.CreateWorkflow(typeof(SimpleWorkflowLibrary.Workflow1),parameters); System.Workflow.Activities.ExternalDataExchangeService externalService = new System.Workflow.Activities.ExternalDataExchangeService(); runtime.AddService(externalService); Service service = new Service(instance.InstanceId); externalService.AddService(service); instance.Start();
Parametry workflow przekazuje się w metodzie CreateWorkflow za pomocą słownika. Następnie należy dodać usługę Service, zaimplementowaną w poprzednim kroku. Po wywołaniu Start, workflow jest przetwarzany.
Jeśli coś jest niezrozumiałe to najlepiej przejrzeć kod, który znajduje się tutaj lub zapytać (za pomocą komentarza na blogu):).