Dynamisches UpdateDynamic Update

Dynamische Updates bieten Entwicklern von Workflowanwendungen die Möglichkeit, die Workflowdefinition einer persistenten Workflowinstanz zu aktualisieren,Dynamic update provides a mechanism for workflow application developers to update the workflow definition of a persisted workflow instance. beispielsweise um eine Fehlerkorrektur oder neue Anforderungen zu implementieren oder um unerwartete Änderungen zu berücksichtigen.This can be to implement a bug fix, new requirements, or to accommodate unexpected changes. Dieses Thema enthält eine Übersicht über die in .NET Framework 4.5.NET Framework 4.5 eingeführte dynamische Updatefunktionalität.This topic provides an overview of the dynamic update functionality introduced in .NET Framework 4.5.NET Framework 4.5.

Dynamisches UpdateDynamic Update

Um dynamische Updates auf eine persistente Workflowinstanz anzuwenden, wird eine DynamicUpdateMap mit Anweisungen für die Laufzeit erstellt, die beschreiben, wie die persistente Workflowinstanz in Anpassung an die gewünschten Änderungen geändert wird.To apply dynamic updates to a persisted workflow instance, a DynamicUpdateMap is created that contains instructions for the runtime that describe how to modify the persisted workflow instance to reflect the desired changes. Nachdem die Updatezuordnung erstellt wurde, wird sie auf die gewünschten persistenten Workflowinstanzen angewendet.Once the update map is created, it is applied to the desired persisted workflow instances. Nachdem das dynamische Update angewendet wurde, kann die Workflowinstanz mithilfe der neuen aktualisierten Workflowdefinition fortgesetzt werden.Once the dynamic update is applied, the workflow instance may be resumed using the new updated workflow definition. Es gibt vier Schritte, die beim Erstellen und Anwenden einer Updatezuordnung erforderlich sind.There are four steps required to create and apply an update map.

  1. Vorbereiten der Workflowdefinition für ein dynamisches updatePrepare the workflow definition for dynamic update

  2. Aktualisieren der Workflowdefinition, um die gewünschten Änderungen widerzuspiegelnUpdate the workflow definition to reflect the desired changes

  3. Erstellen der updatezuordnungCreate the update map

  4. Anwenden der updatezuordnung auf die gewünschten persistenten WorkflowinstanzenApply the update map to the desired persisted workflow instances

Hinweis

Beachten Sie, dass die Schritte 1 bis 3, die die Erstellung der Updatezuordnung umfassen, unabhängig davon ausgeführt werden können, ob das Update angewendet wird.Note that steps 1 through 3, which cover the creation of the update map, may be performed independently of applying the update. Ein häufiges Szenario, dass der Workflowentwickler die updatezuordnung offline erstellen, und klicken Sie dann ein Administrator das Update zu einem späteren Zeitpunkt angewendet wird.A common scenario that the workflow developer will create the update map offline, and then an administrator will apply the update at a later time.

Dieses Thema bietet eine Übersicht über den dynamischen Updateprozess, in dem einer persistenten Instanz eines kompilierten XAML-Workflows eine neue Aktivität hinzugefügt wird.This topic provides an overview of the dynamic update process of adding a new activity to a persisted instance of a compiled Xaml workflow.

Vorbereiten der Workflowdefinition für ein dynamisches updatePrepare the workflow definition for dynamic update

Der erste Schritt im dynamischen Updateprozess besteht darin, die gewünschte Workflowdefinition für das Update vorzubereiten.The first step in the dynamic update process is to prepare the desired workflow definition for update. Hierzu wird die DynamicUpdateServices.PrepareForUpdate-Methode aufgerufen und die zu ändernde Workflowdefinition übergeben.This is done by calling the DynamicUpdateServices.PrepareForUpdate method and passing in the workflow definition to modify. Diese Methode überprüft und durchläuft die Workflowstruktur, um alle Objekte, wie öffentliche Aktivitäten und Variablen, zu identifizieren, die gekennzeichnet werden müssen, damit sie später mit der geänderten Workflowdefinition verglichen werden können.This method validates and then walks the workflow tree to identify all of the objects such as public activities and variables that need to be tagged so they can be compared later with the modified workflow definition. Danach wird die Workflowstruktur geklont und an die ursprüngliche Workflowdefinition angefügt.When this is complete, the workflow tree is cloned and attached to the original workflow definition. Wenn die Updatezuordnung erstellt wird, wird die aktualisierte Version der Workflowdefinition mit der ursprünglichen Workflowdefinition verglichen und die Updatezuordnung auf Grundlage der Unterschiede generiert.When the update map is created, the updated version of the workflow definition is compared with the original workflow definition and the update map is generated based on the differences.

Um einen XAML-Workflow für ein dynamisches Update vorzubereiten, kann er in ActivityBuilder geladen werden, und anschließend wird ActivityBuilder an DynamicUpdateServices.PrepareForUpdate übergeben.To prepare a Xaml workflow for dynamic update it may be loaded into an ActivityBuilder, and then the ActivityBuilder is passed into DynamicUpdateServices.PrepareForUpdate.

Hinweis

Weitere Informationen zum Arbeiten mit serialisierten Workflows und ActivityBuilder, finden Sie unter Serialisieren von Workflows und Aktivitäten in und aus XAML.For more information about working with serialized workflows and ActivityBuilder, see Serializing Workflows and Activities to and from XAML.

Im folgenden Beispiel wird eine MortgageWorkflow-Definition (die aus Sequence mit mehreren untergeordneten Aktivitäten besteht) in ActivityBuilder geladen und anschließend für das dynamische Update vorbereitet.In the following example, a MortgageWorkflow definition (that consists of a Sequence with several child activities) is loaded into an ActivityBuilder, and then prepared for dynamic update. Nach der Methodenrückgabe enthält ActivityBuilder die ursprüngliche Workflowdefinition sowie eine Kopie.After the method returns, the ActivityBuilder contains the original workflow definition as well as a copy.

// 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);

Hinweis

Zum Herunterladen des Beispielcodes, die in diesem Thema begleitet wird, finden Sie unter Beispielcode für dynamische Updates.To download the sample code that accompanies this topic, see Dynamic Update sample code.

Aktualisieren der Workflowdefinition, um die gewünschten Änderungen widerzuspiegelnUpdate the workflow definition to reflect the desired changes

Sobald die Workflowdefinition für das Update vorbereitet wurde, können die gewünschten Änderungen vorgenommen werden.Once the workflow definition has been prepared for updating, the desired changes can be made. Sie können Aktivitäten hinzufügen oder entfernen, öffentliche Variablen hinzufügen, verschieben oder löschen, Argumente hinzufügen oder entfernen und Änderungen an der Signatur von Aktivitätsdelegaten vornehmen.You can add or remove activities, add, move or delete public variables, add or remove arguments, and make changes to the signature of activity delegates. Es ist nicht möglich, eine ausgeführte Aktivität zu entfernen oder die Signatur eines ausgeführten Delegaten zu ändern.You cannot remove a running activity or change the signature of a running delegate. Diese Änderungen können mithilfe von Code oder in einem neu gehosteten Workflow-Designer vorgenommen werden.These changes may be made using code, or in a re-hosted workflow designer. Im folgenden Beispiel wird eine benutzerdefinierte VerifyAppraisal-Aktivität der Sequence-Aktivität hinzugefügt, die den Text von MortgageWorkflow aus dem vorherigen Beispiel darstellt.In the following example, a custom VerifyAppraisal activity is added to the Sequence that makes up the body of the MortgageWorkflow from the previous example.

// 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);

Erstellen der updatezuordnungCreate the update map

Sobald die Workflowdefinition, die für das Update vorbereitet wurde, geändert wurde, kann die Updatezuordnung erstellt werden.Once the workflow definition that was prepared for update has been modified, the update map can be created. Um eine dynamische Updatezuordnung zu erstellen, wird die DynamicUpdateServices.CreateUpdateMap-Methode aufgerufen.To create a dynamic update map, the DynamicUpdateServices.CreateUpdateMap method is invoked. Dadurch wird DynamicUpdateMap mit den Informationen zurückgegeben, die die Laufzeit benötigt, um eine persistente Workflowinstanz zu ändern, damit sie geladen und mit der neuen Workflowdefinition fortgesetzt werden kann.This returns a DynamicUpdateMap that contains the information the runtime needs to modify a persisted workflow instance so that it may be loaded and resumed with the new workflow definition. Im folgenden Beispiel wird eine dynamische Zuordnung für die geänderte MortgageWorkflow Definition aus dem vorherigen Beispiel erstellt.In the following example, a dynamic map is created for the modified MortgageWorkflow definition from the previous example.

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

Diese Updatezuordnung kann sofort verwendet werden, um persistente Workflowinstanzen zu ändern. Meistens wird sie jedoch gespeichert, und die Updates werden später angewendet.This update map can immediately be used to modify persisted workflow instances, or more typically it can be saved and the updates applied later. Eine Möglichkeit zum Speichern der Updatezuordnung besteht darin, sie in eine Datei zu serialisieren, wie im folgenden Beispiel gezeigt.One way to save the update map is to serialize it to a file, as shown in the following example.

// 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);
}

Wenn DynamicUpdateServices.CreateUpdateMap zurückgegeben wird, werden die geklonte Workflowdefinition und andere Informationen zum dynamischen Update, die im Aufruf von DynamicUpdateServices.PrepareForUpdate hinzugefügt wurden, entfernt. Die geänderte Workflowdefinition kann jetzt gespeichert werden, sodass sie später beim Fortsetzen aktualisierter Workflowinstanzen verwendet werden kann.When DynamicUpdateServices.CreateUpdateMap returns, the cloned workflow definition and other dynamic update information that was added in the call to DynamicUpdateServices.PrepareForUpdate is removed, and the modified workflow definition is ready to be saved so that it can be used later when resuming updated workflow instances. Im folgenden Beispiel wird die geänderte Workflowdefinition in MortgageWorkflow_v1.1.xaml gespeichert.In the following example, the modified workflow definition is saved to 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();

Anwenden der updatezuordnung auf die gewünschten persistenten WorkflowinstanzenApply the update map to the desired persisted workflow instances

Die Updatezuordnung kann jederzeit angewendet werden, nachdem sie erstellt wurde.Applying the update map can be done at any time after creating it. Sie kann mithilfe der DynamicUpdateMap-Instanz, die von DynamicUpdateServices.CreateUpdateMap zurückgegeben wurde, direkt ausgeführt werden, oder später mithilfe einer gespeicherten Kopie der Updatezuordnung.It can be done right away using the DynamicUpdateMap instance that was returned by DynamicUpdateServices.CreateUpdateMap, or it can be done later using a saved copy of the update map. Um eine Workflowinstanz zu aktualisieren, laden Sie sie unter Verwendung von WorkflowApplicationInstance in WorkflowApplication.GetInstance.To update a workflow instance, load it into a WorkflowApplicationInstance using WorkflowApplication.GetInstance. Als Nächstes erstellen Sie WorkflowApplication mithilfe der aktualisierten Workflowdefinition und unter Verwendung der gewünschten WorkflowIdentity.Next, create a WorkflowApplication using the updated workflow definition, and the desired WorkflowIdentity. WorkflowIdentity kann sich von der Identität unterscheiden, die zum persistenten Speichern des ursprünglichen Workflows verwendet wurde. Sie wird in der Regel verwendet, um anzugeben, dass die persistente Instanz geändert wurde.This WorkflowIdentity may be different than the one that was used to persist the original workflow, and typically is in order to reflect that the persisted instance has been modified. NachdemWorkflowApplication erstellt wurde, wird sie mithilfe der Überladung von WorkflowApplication.Load, das DynamicUpdateMap verwendet, geladen und dann mit einem Aufruf von WorkflowApplication.Unload entladen.Once the WorkflowApplication is created, it is loaded using the overload of WorkflowApplication.Load that takes a DynamicUpdateMap, and then unloaded with a call to WorkflowApplication.Unload. Dadurch wird das dynamische Update angewendet und die aktualisierte Workflowinstanz persistent gespeichert.This applies the dynamic update and persists the updated workflow instance.

// 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();
}

Fortsetzen einer aktualisierten WorkflowinstanzResuming an Updated Workflow Instance

Nachdem ein dynamisches Update angewendet wurde, kann die Workflowinstanz fortgesetzt werden.Once dynamic update has been applied, the workflow instance may be resumed. Beachten Sie, dass die neue aktualisierte Definition und WorkflowIdentity verwendet werden müssen.Note that the new updated definition and WorkflowIdentity must be used.

Hinweis

Weitere Informationen zum Arbeiten mit WorkflowApplication und WorkflowIdentity, finden Sie unter Verwenden von WorkflowIdentity und Versionsverwaltung.For more information about working with WorkflowApplication and WorkflowIdentity, see Using WorkflowIdentity and Versioning.

Im folgenden Beispiel wurde der MortgageWorkflow_v1.1.xaml-Workflow aus dem vorherigen Beispiel kompiliert. Anschließend wird er geladen und mit der aktualisierten Workflowdefinition fortgesetzt.In the following example, the MortgageWorkflow_v1.1.xaml workflow from the previous example has been compiled, and is loaded and resumed using the updated workflow definition.

// 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(...);

Hinweis

Zum Herunterladen des Beispielcodes, die in diesem Thema begleitet wird, finden Sie unter Beispielcode für dynamische Updates.To download the sample code that accompanies this topic, see Dynamic Update sample code.