Seit 2 Wochen beschäftige ich mit der Workflow Foundation. Die Foundation ist ein echt netter Ansatz, wer mit BizTalk gearbeitet hat, dem wird vieles ähnlich vorkommen. Für die Realisierung von Projekten bringt die Foundation nette Vorteile, da eine zusätzliche Abstraktionsebene geschaffen wird. Somit wird der Programmfluss/-ablauf z. B. auch für nicht Entwickler verständlich und nachvollziehbar. Als Addon auf die Nachvollziehbarkeit wird es für Fachabteilungen ermöglicht, dass die Verarbeitungsreihenfolge von Prozessen verändert werden kann. Es wird dadurch immer noch nicht möglich den gesamten Code zu verändern, aber wenigstens etwas.
Meine Erfahrungen beschränken sich bisher auf einen Workflow ohne externe Events. Bei externen Events muss man an Persistenzschichten denken. (Email an Benutzer -> Benutzer antwortet)
Der große Unterschied von BizTalk und WF ist, dass BizTalk eine komplette Umgebung mit Persistenzmechanismen ist. Momentan komme ich mit dem Fehlerhandling des BizTalks besser klar, als mit dem Fehlerhandling in der WF. Wobei es in der WF bunter ist. J
Die Erweiterbarkeit der WF ist relativ einfach über CustomActivities möglich, eine solcher CustomActivities ist in der HOL (Hands on Labs) enthalten. Aus meiner Sicht hätte man unbedingt eine ExcecutionActivity integrieren müssen. Nun gut, so musste ich meine eigene Schreiben. Die Extensions sind unter http://www.codeplex.com/capevisionWorkflow/Release/ProjectReleases.aspx?ReleaseId=6382 downloadbar.
Mein erster Workflow soll das Anlegen eines Projektes vereinfacht werden und für Nutzer ohne zusätzliche Rechte möglich. Allerdings wird die Eingabe nicht im Workflow sonder über eine separate Web-Oberfläche realisiert. Der Workflow ist für das Anlegen und Benachrichtigen von Komponenten und Nutzern zuständig.
Das ausführen von Workflows ist in den HOLs und vielen Blogs zu finden. Zur Vollständigkeit ist hier mal der Start meines Workflows abgebildet.
using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
{
AutoResetEvent waitHandle = new AutoResetEvent(false);
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
workflowRuntime.ServicesExceptionNotHandled += delegate(object sender, ServicesExceptionNotHandledEventArgs e)
{
Trace.WriteLine(this.GetLogMessageFormatted("Unhandled Exception! "+e.Exception.ToString()));
};
workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
{
wfEx = e.Exception;
Trace.WriteLine(this.GetLogMessageFormatted("Termination! "+e.Exception.ToString()));
waitHandle.Set();
};
WorkflowInstance instance = workflowRuntime.CreateWorkflow(this.Configuration.Workflow, parameter);
instance.Start();
waitHandle.WaitOne();
}
Wer Parameter zum Workflow hinzufügen will, der gibt diese beim Aufruf der CreateWorkflow-Methode mit. Im Workflow müssen dann Properties mit getter und setter eingefügt werden, die den gleichen Namen wie die Parameter haben. Alles in allem sehr einfach.
Weitere Services (z.B. für Persistenzschicht) werden über die Workflow-Runtime-Instanz hinzugefügt.
Hier noch einiger meiner Links: http://del.icio.us/splushi/wf
Keine Kommentare:
Kommentar veröffentlichen