ExternalDataExchangeService és a WCA

A Workflow Foundationben a workflow példányok és a külvilág közötti kommunikáció megvalósítására használhatjuk a QueuingService-t, vagy még inkább az ExternalDataExchangeService-t (EDES). Rossz nyelvek szerint az EDES a SharePoint miatt került a WF-be (a WSS hosztolja a WF-t), amit ismerve a WSS-t simán el tudok képzelni, olyan is…

Az alapgondolat jó: a kommunikáció legyen interfész alapú, azaz egy interfész határozza meg a workflow példány és a külvilág számára is, hogy milyen üzenetek és adatok utazhatnak a két fél között. Csak mindennek az implementálása sikerült bonyolultra, legalábbis a WF közösség nagy része ezen a véleményen van. Elsőre tényleg bonyolult, de hozzá lehet (kell) szokni. Ahhoz, hogy egy workflow példány elküldje akár egyetlen változó értékét a hoszt alkalmazás számára (például egy jóváhagyási folyamatban) és az visszajelezzen, hogy oké vagy nem oké, a következő lépésekre van szükség:

1. A workflow meg tudja hívni a külvilág metódusait illetve tud reagálni bizonyos eseményekre, amelyek a "külvilágból érkeznek". Ezeket a metódusokat és eseményeket egy interfészen (vagy-ben?) kell definiálnunk, melyet el kell látnunk az [ExternalDataExchange] attribútummal.

2. Ahhoz, hogy egy eseménykezelő metódus esemény paramétereket kapjon (például bool oké vagy nem oké), szükség van egy saját EventArgs osztályra, amit kötelezően az ExternalDataEventArgs osztályból kell származtatnunk.

3. A workflow definíciónkba be kell építenünk legalább egy CallExternalMethod vagy egy HandleExternalEvent activity-t, melyeknek meg kell adnunk az interfészt és azon valamelyik metódus vagy esemény nevét.

4. A külvilágban (például a hoszt alkalmazásban) implementálnunk kell az interfészt, ez lesz az ún. local service osztályunk. Ebben tudjuk implementálni a workflow példány által meghívott metódusokat és tudunk gondoskodni arról, hogy az események elsüljenek (például az események elsütését egy-egy metódusba csomagoljuk).

5. A hoszt alkalmazásnak a megfelelő pillanatban el kell sütnie az eseményeket (vagy meg kell hívnia az elsütést burkoló metódusokat) és át kell adnia a saját esemény paramétereken kívül a cél workflow példány azonosítóját (GUID), amit tehát valahol a hoszt alkalmazásban nyilván kell tartani.

ExternalDataExchangeService

Lássuk be, mindennek a megvalósítása nem két perces feladat, sőt jó esélyünk van rá, hogy első alkalommal elveszünk valamelyik részletben. Nézzük például azt a részletet, hogy a workflow-ban szeretnénk felhasználni a saját ExternalDataEventArgs osztályunk hozzáadott tulajdonságát. Erre ugye jó esély van, hiszen valószínűleg ezért adtuk át…

Ha megnézzük a Visual Studio workflow designerét, azt fogjuk látni, hogy nem tudjuk külön kötni ezt a tulajdonságot, csak az egész EventArgsot, tehát még ennek felbontásával is küzdhetünk.

Egy kis segítséget jelenthet a Windows Vista SDK-ban található Workflow Communications Activity generator utility, a wca.exe. Ez a parancssoros alkalmazás képes megérteni az [ExternalDataExchange] attribútummal ellátott interfészt, és abból saját activity-ket generálni, melyek a CallExternalMethod és a HandleExternalEvent activity-kből származnak. Ezeket a workflow definícióba helyezve nem kell vacakolnunk az interfész beállításával és még az egyes EventArgs tulajdonságokhoz is tudunk más mezőket kötni. Az eszköz a megadott nyelven, a megadott névtérben és a megadott mappában forráskódot generál, amit természetes akár át is írhatunk. A program a C:Program FilesMicrosoft SDKsWindowsv6.0Bin mappában található és mindössze 51KB, tehát nyugodtan másolhatjuk a forráskódunk közelébe.

Érdemes használni ezt a kis segédprogramot, kényelmesebbé teszi az EDES használatát, de persze ettől még nem fogjuk szeretni…

 

Technorati tags: , ,

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s