Megosztás a következőn keresztül:


Dinamikus frissítés

A dinamikus frissítés egy mechanizmust biztosít a munkafolyamat-alkalmazás fejlesztői számára, amely frissíti a munkafolyamat-definíciót egy megőrzött munkafolyamat-példányhoz. Ez lehet hibajavítás, új követelmények vagy váratlan változások megoldása. Ez a témakör áttekintést nyújt a .NET-keretrendszer 4.5-ben bevezetett dinamikus frissítési funkciókról.

Dinamikus frissítés

Ha dinamikus frissítéseket szeretne alkalmazni egy megőrzött munkafolyamat-példányra, létrejön egy DynamicUpdateMap olyan, a futtatókörnyezetre vonatkozó utasítások, amelyek ismertetik, hogyan módosíthatja a megőrzött munkafolyamat-példányt a kívánt módosításoknak megfelelően. A frissítési térkép létrehozása után a rendszer alkalmazza a kívánt, megőrzött munkafolyamat-példányokra. A dinamikus frissítés alkalmazása után a munkafolyamat-példány újraindulhat az új frissített munkafolyamat-definícióval. A frissítési térkép létrehozásához és alkalmazásához négy lépés szükséges.

  1. A munkafolyamat-definíció előkészítése dinamikus frissítéshez

  2. A munkafolyamat-definíció frissítése a kívánt módosításoknak megfelelően

  3. A frissítési térkép létrehozása

  4. A frissítési térkép alkalmazása a kívánt, megőrzött munkafolyamat-példányokra

Feljegyzés

Vegye figyelembe, hogy a frissítési térkép létrehozására vonatkozó 1–3. lépés a frissítés alkalmazásától függetlenül is végrehajtható. Gyakori forgatókönyv, hogy a munkafolyamat-fejlesztő offline állapotban hozza létre a frissítési térképet, majd a rendszergazda később alkalmazza a frissítést.

Ez a témakör áttekintést nyújt arról a dinamikus frissítési folyamatról, amely egy új tevékenységet ad hozzá egy lefordított Xaml-munkafolyamat egy megőrzött példányához.

A munkafolyamat-definíció előkészítése dinamikus frissítéshez

A dinamikus frissítési folyamat első lépése a kívánt munkafolyamat-definíció előkészítése a frissítéshez. Ez úgy történik, hogy meghívja a metódust DynamicUpdateServices.PrepareForUpdate , és átadja a munkafolyamat-definíciót a módosításhoz. Ez a módszer ellenőrzi, majd végigvezeti a munkafolyamatfán az összes olyan objektum azonosításához, mint a nyilvános tevékenységek és a címkézendő változók, hogy később összehasonlíthatók legyenek a módosított munkafolyamat-definícióval. Ha ez befejeződött, a munkafolyamat-fa klónozva lesz, és az eredeti munkafolyamat-definícióhoz lesz csatolva. A frissítési térkép létrehozásakor a rendszer összehasonlítja a munkafolyamat-definíció frissített verzióját az eredeti munkafolyamat-definícióval, és a frissítési térkép a különbségek alapján jön létre.

Ha egy Xaml-munkafolyamatot szeretne előkészíteni a dinamikus frissítéshez, az betölthető egy ActivityBuilder, majd a ActivityBuilder rendszerbe DynamicUpdateServices.PrepareForUpdate.

Feljegyzés

A szerializált munkafolyamatok ActivityBuilderhasználatával kapcsolatos további információkért lásd: Munkafolyamatok és tevékenységek szerializálása az XAML-be és onnan.

Az alábbi példában egy MortgageWorkflow definíció (amely több gyermektevékenységből áll Sequence ) betöltődik egy ActivityBuilder, majd dinamikus frissítésre előkészítve. A metódus visszatérése után az ActivityBuilder eredeti munkafolyamat-definíciót és egy másolatot is tartalmaz.

// Load the MortgageWorkflow definition from Xaml into
// an ActivityBuilder.
XamlXmlReaderSettings readerSettings = new XamlXmlReaderSettings()
{
    LocalAssembly = Assembly.GetExecutingAssembly()
};

XamlXmlReader xamlReader = new XamlXmlReader(@"C:\WorkflowDefinitions\MortgageWorkflow.xaml",
    readerSettings);

ActivityBuilder ab = XamlServices.Load(
    ActivityXamlServices.CreateBuilderReader(xamlReader)) as ActivityBuilder;

// Prepare the workflow definition for dynamic update.
DynamicUpdateServices.PrepareForUpdate(ab);

A munkafolyamat-definíció frissítése a kívánt módosításoknak megfelelően

Miután előkészítette a munkafolyamat-definíciót a frissítésre, a kívánt módosításokat végre lehet hozni. Tevékenységeket vehet fel vagy távolíthat el, nyilvános változókat vehet fel, helyezhet át vagy törölhet, argumentumokat vehet fel vagy távolíthat el, valamint módosíthatja a tevékenységdelegáltak aláírását. Futó tevékenységet nem távolíthat el, és nem módosíthatja a futó meghatalmazott aláírását. Ezek a módosítások kóddal vagy egy újra üzemeltetett munkafolyamat-tervezőben végezhetők el. Az alábbi példában egy egyéni VerifyAppraisal tevékenység lesz hozzáadva a sorozathoz, amely az MortgageWorkflow előző példa törzsét alkotja.

// Make desired changes to the definition. In this example, we are
// inserting a new VerifyAppraisal activity as the 3rd child of the root Sequence.
VerifyAppraisal va = new VerifyAppraisal
{
    Result = new VisualBasicReference<bool>("LoanCriteria")
};

// Get the Sequence that makes up the body of the workflow.
Sequence s = ab.Implementation as Sequence;

// Insert the new activity into the Sequence.
s.Activities.Insert(2, va);

A frissítési térkép létrehozása

Miután módosította a frissítésre előkészített munkafolyamat-definíciót, létre lehet hozni a frissítési térképet. Dinamikus frissítési térkép létrehozásához a DynamicUpdateServices.CreateUpdateMap metódus meghívása történik. Ez egy DynamicUpdateMap olyan információt ad vissza, amely tartalmazza azokat az információkat, amelyeket a futtatókörnyezetnek módosítania kell egy tárolt munkafolyamat-példányon, hogy betölthesse és folytathassa azt az új munkafolyamat-definícióval. Az alábbi példában egy dinamikus térkép jön létre az előző példában módosított MortgageWorkflow definícióhoz.

// Create the update map.
DynamicUpdateMap map = DynamicUpdateServices.CreateUpdateMap(ab);

Ez a frissítési térkép azonnal használható a tárolt munkafolyamat-példányok módosítására, vagy általában menthető, és a frissítések később is alkalmazhatók. A frissítési térkép mentésének egyik módja, ha szerializálja azt egy fájlba, ahogyan az az alábbi példában is látható.

// Serialize the update map to a file.
DataContractSerializer serializer = new DataContractSerializer(typeof(DynamicUpdateMap));
using (FileStream fs = System.IO.File.Open(@"C:\WorkflowDefinitions\MortgageWorkflow.map", FileMode.Create))
{
    serializer.WriteObject(fs, map);
}

Visszatéréskor DynamicUpdateServices.CreateUpdateMap a rendszer eltávolítja a klónozott munkafolyamat-definíciót és a hívásban DynamicUpdateServices.PrepareForUpdate hozzáadott egyéb dinamikus frissítési információkat, és a módosított munkafolyamat-definíció készen áll a mentésre, hogy később is felhasználható legyen a frissített munkafolyamat-példányok folytatásakor. Az alábbi példában a módosított munkafolyamat-definíciót a program a következőre MortgageWorkflow_v1.1.xamlmenti:

// Save the modified workflow definition.
StreamWriter sw = File.CreateText(@"C:\WorkflowDefinitions\MortgageWorkflow_v1.1.xaml");
XamlWriter xw = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(sw, new XamlSchemaContext()));
XamlServices.Save(xw, ab);
sw.Close();

A frissítési térkép alkalmazása a kívánt, megőrzött munkafolyamat-példányokra

A frissítési térkép alkalmazása a létrehozás után bármikor elvégezhető. Azonnal elvégezhető a DynamicUpdateMap visszaadott DynamicUpdateServices.CreateUpdateMappéldány használatával, vagy később a frissítési térkép mentett példányával. A munkafolyamat-példány frissítéséhez töltse be egy WorkflowApplicationInstance használatba WorkflowApplication.GetInstance. Ezután hozzon létre egy WorkflowApplication frissített munkafolyamat-definíciót és a kívántat WorkflowIdentity. Ez WorkflowIdentity eltérhet az eredeti munkafolyamat megőrzéséhez használttól, és általában annak érdekében, hogy tükrözze a megőrzött példány módosítását. A létrehozás után a WorkflowApplication rendszer betölti WorkflowApplication.Load azt a túlterheléssel, amely egy elemet vesz igénybe DynamicUpdateMap, majd egy hívással WorkflowApplication.Unloadkiüríti. Ez a dinamikus frissítést alkalmazza, és megőrzi a frissített munkafolyamat-példányt.

// Load the serialized update map.
DynamicUpdateMap map;
using (FileStream fs = File.Open(@"C:\WorkflowDefinitions\MortgageWorkflow.map", FileMode.Open))
{
    DataContractSerializer serializer = new DataContractSerializer(typeof(DynamicUpdateMap));
    object updateMap = serializer.ReadObject(fs);
    if (updateMap == null)
    {
        throw new ApplicationException("DynamicUpdateMap is null.");
    }

    map = (DynamicUpdateMap)updateMap;
}

// Retrieve a list of workflow instance ids that corresponds to the
// workflow instances to update. This step is the responsibility of
// the application developer.
List<Guid> ids = GetPersistedWorkflowIds();
foreach (Guid id in ids)
{
    // Get a proxy to the persisted workflow instance.
    SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString);
    WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(id, store);

    // If desired, you can inspect the WorkflowIdentity of the instance
    // using the DefinitionIdentity property to determine whether to apply
    // the update.
    Console.WriteLine(instance.DefinitionIdentity);

    // Create a workflow application. You must specify the updated workflow definition, and
    // you may provide an updated WorkflowIdentity if desired to reflect the update.
    WorkflowIdentity identity = new WorkflowIdentity
    {
        Name = "MortgageWorkflow v1.1",
        Version = new Version(1, 1, 0, 0)
    };

    // Load the persisted workflow instance using the updated workflow definition
    // and with an updated WorkflowIdentity. In this example the MortgageWorkflow class
    // contains the updated definition.
    WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

    // Apply the dynamic update on the loaded instance.
    wfApp.Load(instance, map);

    // Unload the updated instance.
    wfApp.Unload();
}

Frissített munkafolyamat-példány folytatása

A dinamikus frissítés alkalmazása után a munkafolyamat-példány újraindulhat. Vegye figyelembe, hogy az új frissített definíciót WorkflowIdentity kell használni.

Feljegyzés

További információ a munkafolyamat-dentitás WorkflowIdentityWorkflowApplication és a verziószámozás használatáról.

Az alábbi példában az MortgageWorkflow_v1.1.xaml előző példa munkafolyamata lefordítva lett, és a frissített munkafolyamat-definícióval töltődik be és folytatódik.

// Load the persisted workflow instance using the updated workflow definition
// and updated WorkflowIdentity.
WorkflowIdentity identity = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1.1",
    Version = new Version(1, 1, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure persistence and desired workflow event handlers.
// (Omitted for brevity.)
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(InstanceId);

// Resume the workflow.
// wfApp.ResumeBookmark(...);