Dynamická aktualizace

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.

Dynamická aktualizace

Chcete-li použít dynamické aktualizace na trvalé instanci pracovního postupu, je vytvořena, která obsahuje pokyny pro modul runtime, který popisuje, jak upravit trvalou instanci pracovního postupu tak, DynamicUpdateMap 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.

  1. Příprava definice pracovního postupu pro dynamickou aktualizaci

  2. Aktualizujte definici pracovního postupu tak, aby odrážela požadované změny.

  3. Vytvoření mapy aktualizací

  4. Použití mapy aktualizace u požadovaných trvalých instancí pracovního postupu

Poznámka:

Všimněte si, že kroky 1 až 3, které pokrývají vytvoření mapy aktualizace, mohou být provedeny nezávisle na instalaci aktualizace. Běžný scénář, kdy vývojář pracovního postupu vytvoří mapu aktualizací offline a správce ji později použije.

Toto téma 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 souboru ActivityBuildera 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 MortgageWorkflow se do souboru načte ActivityBuilderdefinice (která se skládá z Sequence několika podřízených aktivit) a pak je připravená na dynamickou aktualizaci. Po vrácení ActivityBuilder metody obsahuje původní definici pracovního postupu i 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. Spuštěnou aktivitu nelze odebrat ani změnit 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í VerifyAppraisal aktivita, která tvoří tělo MortgageWorkflow z předchozího příkladu.

// 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ě trvalých instancí pracovního postupu nebo je obvykle lze uložit a aktualizace použité později. 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žití mapy aktualizace u požadovaných trvalých instancí 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. Pokud chcete aktualizovat instanci pracovního postupu, načtěte ji do souboru WorkflowApplicationInstance using 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 původního pracovního postupu, který byl použit k zachování původního pracovního postupu, a obvykle se liší tak, aby odrážel, že trvalá instance byla změněna. WorkflowApplication Po vytvoření se načte pomocí přetíženíWorkflowApplication.Load, které vezme DynamicUpdateMapa poté 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(...);