Workflow Monitor layouttal

Aki használta már a Windows Workflow Foundationben a tracking service-t, biztosan találkozott már az SDK-ban lévő Workflow Monitor alkalmazással, ami lehetővé teszi, hogy a Visual Studiohoz hasonlóan, grafikusan jelenítsük meg a folyamataink állapotát. Mivel ez az alkalmazás forráskóddal együtt elérhető, remek példa arra, hogy megtanuljuk, hogyan hosztolhatjuk a WorkflowView kontrollt saját alkalmazásainkban. A feladat egyébként nem egyszerű, jobban járunk, ha a kész példából vesszük az osztályokat, többre is szükségünk lesz😦

Van egy fontos dolog, amire ebben a kódban nem találunk példát, ez pedig a folyamatábrák layoutjának kezelése. Ez szekvenciális workflow esetén nem probléma, hiszen ott úgysem lehet mozgatni az activity-ket, állapotgépek esetén viszont jó lenne, ha a monitorban is úgy jelennének meg a folyamataink, ahogy azokat a Studioban megrajzoltuk. Ha erről nem gondoskodunk, akkor az összes állapot-dobozunk egymás alatt fog elhelyezkedni, keresztül-kasul behálózva az összekötő vonalakkal.

A tetszetős című Everything about re-hosting the Workflow Designer című MSDN cikkben találunk utalást arra, hogyan menthetjük el a layoutot fájlba és tölthetjük vissza a layoutot fájlból. Ezzel csak egy baj van, kell hozzá layout fájl! Nem is probléma, hiszen a VS készít nekünk olyat, ott van .layout kiterjesztéssel, pont arra van szükség. Csakhogy ha ezt a megközelítést választjuk, a layout fájlnak ott kell lennie a futtatandó alkalmazásunk mellett, azaz ezt is telepíteni kell. Amikor pedig a telepítőt készítjük, beleütközünk abba a problémába, hogy a forrásfában kénytelenek leszünk vagy saját build eventeket írni, vagy pedig duplikálni a layout fájlt. Egyik sem túl fincsi.

Az igazi megoldás az lenne, ha fel tudnánk használni ugyanazt a fájlt futási időben, amit a Studio is használ fejlesztési időben. Ha a Properties ablakban megnézzük a .layout fájl Build Actionjét, láthatjuk, hogy Embedded Resource lesz belőle, nincs más dolgunk tehát, mint onnan kiolvasni.

Először megpróbáltam közvetlenül kiolvasni a fájl tartalmát ugyanúgy, mint ahogy más erőforrást kezelni szoktunk. Mivel ez nem vezetett eredményre, természetesen Reflectorhoz nyúltam és az alábbi eredményre jutottam: a Loader.cs fájlban található a WorkflowDesignerLoaderből származó Loader osztály, ami a folyamatok betöltéséért felelős. Ebben írjuk felül az OnEndLoad eseménykezelőt:

  protected override void OnEndLoad( bool successful, ICollection errors )
  {
    base.OnEndLoad( successful, errors );

    IList layoutErrors = null;
    IWorkflowRootDesigner rootDesigner = 
(IWorkflowRootDesigner) ActivityDesigner.GetRootDesigner( base.LoaderHost ); Type type = rootDesigner.Component.GetType(); string manifestResourceName = type.Name + ".layout"; this.LoadDesignerLayoutFromResource( type, manifestResourceName, out layoutErrors ); }

Így már csak arra az egy szerelvényre van szükségünk, amiben a workflow definíció is található és ugyanúgy fog megjelenni a Monitorban, mint a fejlesztőkörnyezetben.

 

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