Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Dynamická aktualizace poskytuje vývojářům aplikací pracovních postupů mechanismus pro aktualizaci definice pracovního postupu trvalé instance pracovního postupu. Může se jednat o implementaci opravy chyb, nových požadavků nebo řešení neočekávaných změn. Toto téma obsahuje přehled funkcí dynamické aktualizace představené v rozhraní .NET Framework 4.5.
Chcete-li použít dynamické aktualizace na trvalou instanci pracovního postupu, je nejprve vytvořen DynamicUpdateMap, který obsahuje pokyny pro modul runtime, jež popisují, jak upravit tuto trvalou instanci pracovního postupu tak, aby odrážela požadované změny. Po vytvoření mapy aktualizace se použije u požadovaných trvalých instancí pracovního postupu. Po použití dynamické aktualizace může být instance pracovního postupu obnovena pomocí nové aktualizované definice pracovního postupu. K vytvoření a instalaci mapy aktualizace jsou potřeba čtyři kroky.
- Připravte definici pracovního postupu pro dynamickou aktualizaci.
- Aktualizujte definici pracovního postupu tak, aby odrážela požadované změny.
- Vytvořte mapu aktualizací.
- Nainstalujte mapu aktualizace na požadované trvalé instance pracovního postupu.
Poznámka:
Kroky 1 až 3, které pokrývají vytvoření mapy aktualizací, je možné provádět nezávisle na instalaci aktualizace. Běžným scénářem je, že vývojář pracovního postupu vytvoří mapu aktualizací offline a správce tuto aktualizaci použije později.
Tento článek obsahuje přehled procesu dynamické aktualizace přidání nové aktivity do trvalé instance kompilovaného pracovního postupu Xaml.
Příprava definice pracovního postupu pro dynamickou aktualizaci
Prvním krokem procesu dynamické aktualizace je příprava požadované definice pracovního postupu pro aktualizaci. To se provádí voláním DynamicUpdateServices.PrepareForUpdate metody a předáním definice pracovního postupu k úpravě. Tato metoda ověří a pak provede strom pracovního postupu k identifikaci všech objektů, jako jsou veřejné aktivity a proměnné, které je potřeba označit, aby je bylo možné porovnat později s upravenou definicí pracovního postupu. Po dokončení se strom pracovního postupu naklonuje a připojí k původní definici pracovního postupu. Po vytvoření mapy aktualizací se aktualizovaná verze definice pracovního postupu porovná s původní definicí pracovního postupu a mapa aktualizací se vygeneruje na základě rozdílů.
Chcete-li připravit pracovní postup Xaml na dynamickou aktualizaci, může být načten do objektu ActivityBuilder, a pak je ActivityBuilder předán do DynamicUpdateServices.PrepareForUpdate.
Poznámka:
Další informace o práci se serializovanými pracovními postupy a ActivityBuildernaleznete v tématu Serializace pracovních postupů a aktivit do a z XAML.
V následujícím příkladu je definice MortgageWorkflow (která se skládá z Sequence několika podřízených aktivit) načtena do ActivityBuilder a poté připravena pro dynamickou aktualizaci. Po vrácení metody ActivityBuilder obsahuje původní definici pracovního postupu i její kopii.
// 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);
Aktualizujte definici pracovního postupu tak, aby odrážela požadované změny.
Jakmile je definice pracovního postupu připravená na aktualizaci, je možné provést požadované změny. Můžete přidávat nebo odebírat aktivity, přidávat, přesouvat nebo odstraňovat veřejné proměnné, přidávat nebo odebírat argumenty a měnit podpis delegátů aktivit. Nelze odstranit spuštěnou aktivitu ani upravit podpis spuštěného delegáta. Tyto změny mohou být provedeny pomocí kódu nebo v návrháři pracovních postupů v znovu hostované verzi. V následujícím příkladu se do sekvence přidá vlastní aktivita VerifyAppraisal, která tvoří tělo z předchozího příkladu MortgageWorkflow.
// 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);
Vytvoření mapy aktualizací
Jakmile je definice pracovního postupu připravená na aktualizaci upravena, můžete mapu aktualizace vytvořit. Chcete-li vytvořit mapu dynamické aktualizace, vyvolá se DynamicUpdateServices.CreateUpdateMap metoda. Vrátí hodnotu DynamicUpdateMap obsahující informace, které modul runtime potřebuje k úpravě trvalé instance pracovního postupu, aby bylo možné ji načíst a obnovit pomocí nové definice pracovního postupu. V následujícím příkladu se vytvoří dynamická mapa pro upravenou MortgageWorkflow definici z předchozího příkladu.
// Create the update map.
DynamicUpdateMap map = DynamicUpdateServices.CreateUpdateMap(ab);
Tuto mapu aktualizací lze okamžitě použít k úpravě perzistentních instancí pracovního postupu, nebo ji obvykle lze uložit pro pozdější použití, kdy se aktualizace provedou. Jedním ze způsobů, jak uložit mapu aktualizace, je serializovat ji do souboru, jak je znázorněno v následujícím příkladu.
// 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);
}
Po DynamicUpdateServices.CreateUpdateMap návratu se odeberou definice klonovaného pracovního postupu a další informace o dynamické aktualizaci přidané do volání DynamicUpdateServices.PrepareForUpdate a upravená definice pracovního postupu je připravená k uložení, aby ji bylo možné později použít při obnovení aktualizovaných instancí pracovního postupu. V následujícím příkladu je upravená definice pracovního postupu uložena do MortgageWorkflow_v1.1.xaml.
// 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();
Použijte mapu aktualizace na požadované uložené a trvalé instance pracovního postupu.
Instalaci mapy aktualizací je možné provést kdykoli po jeho vytvoření. Můžete ho provést okamžitě pomocí DynamicUpdateMap instance, která byla vrácena DynamicUpdateServices.CreateUpdateMap, nebo ji lze provést později pomocí uložené kopie mapy aktualizace. Pro aktualizaci instance pracovního postupu ji načtěte do WorkflowApplicationInstance pomocí WorkflowApplication.GetInstance. Dále vytvořte WorkflowApplication pomocí aktualizované definice pracovního postupu a požadovaného WorkflowIdentity. Může WorkflowIdentity se lišit od verze, která byla použita k uložení původního pracovního postupu, a obvykle se liší, aby odrážela, že uložená instance byla změněna. Jakmile je WorkflowApplication vytvořen, načte se pomocí přetížení WorkflowApplication.Load, které vezme DynamicUpdateMap, a poté je uvolněno voláním WorkflowApplication.Unload. Tím se použije dynamická aktualizace a zachová aktualizovanou instanci pracovního postupu.
// 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();
}
Obnovení aktualizované instance pracovního postupu
Po použití dynamické aktualizace může být instance pracovního postupu obnovena. Všimněte si, že nová aktualizovaná definice a WorkflowIdentity musí být použita.
Poznámka:
Další informace o práci s WorkflowApplication a WorkflowIdentity, naleznete v tématu Použití WorkflowIdentity a správy verzí.
V následujícím příkladu MortgageWorkflow_v1.1.xaml byl pracovní postup z předchozího příkladu zkompilován a načten a obnoven pomocí aktualizované definice pracovního postupu.
// 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(...);