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.
A munkafolyamat-definíció előkészítése dinamikus frissítéshez
A munkafolyamat-definíció frissítése a kívánt módosításoknak megfelelően
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.xaml
menti:
// 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(...);
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: