Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das dynamische Update stellt einen Mechanismus für Workflowanwendungsentwickler bereit, um die Workflowdefinition einer dauerhaften Workflowinstanz zu aktualisieren. Dies kann notwendig sein, um eine Fehlerbehebung, neue Anforderungen oder unerwartete Änderungen zu implementieren. Dieses Thema enthält eine Übersicht über die dynamische Updatefunktionalität, die in .NET Framework 4.5 eingeführt wurde.
Um dynamische Updates auf eine beibehaltene Workflowinstanz anzuwenden, wird eine DynamicUpdateMap erstellt, die Anweisungen für die Laufzeit enthält, die beschreibt, wie die beibehaltene Workflowinstanz geändert wird, um die gewünschten Änderungen widerzuspiegeln. Nachdem die Aktualisierungszuordnung erstellt wurde, wird sie auf die gewünschten beibehaltenen Workflowinstanzen angewendet. Nachdem die dynamische Aktualisierung angewendet wurde, kann die Workflowinstanz mit der neuen aktualisierten Workflowdefinition fortgesetzt werden. Es sind vier Schritte erforderlich, um eine Aktualisierungskarte zu erstellen und einzusetzen.
- Bereiten Sie die Workflowdefinition für die dynamische Aktualisierung vor.
- Aktualisieren Sie die Workflowdefinition so, dass sie die gewünschten Änderungen widerspiegelt.
- Erstellen Sie die Update-Karte.
- Wenden Sie die Aktualisierungskarte auf die gewünschten persistierten Workflow-Instanzen an.
Hinweis
Die Schritte 1 bis 3, die die Erstellung der Aktualisierungskarte abdecken, können unabhängig von der Anwendung des Updates ausgeführt werden. Ein häufiges Szenario ist, dass der Workflowentwickler die Updatezuordnung offline erstellt, und dann wendet ein Administrator das Update zu einem späteren Zeitpunkt an.
Dieser Artikel enthält eine Übersicht über den dynamischen Aktualisierungsprozess zum Hinzufügen einer neuen Aktivität zu einer dauerhaften Instanz eines kompilierten XAML-Workflows.
Vorbereiten der Workflowdefinition für dynamische Updates
Der erste Schritt im Prozess der dynamischen Aktualisierung besteht darin, die gewünschte Workflowdefinition für die Aktualisierung vorzubereiten. Dazu rufen Sie die DynamicUpdateServices.PrepareForUpdate Methode auf und übergeben die Workflowdefinition, um sie zu ändern. Diese Methode validiert und durchläuft dann den Workflow-Baum, um alle Objekte wie öffentliche Aktivitäten und Variablen zu identifizieren, die markiert werden müssen, so dass sie später mit der geänderten Workflow-Definition verglichen werden können. Wenn dies abgeschlossen ist, wird der Workflow-Baum geklont und an die ursprüngliche Workflow-Definition angehängt. Wenn die Aktualisierungszuordnung erstellt wird, wird die aktualisierte Version der Workflowdefinition mit der ursprünglichen Workflowdefinition verglichen, und die Aktualisierungszuordnung wird basierend auf den Unterschieden generiert.
Um einen XAML-Workflow für dynamische Aktualisierungen vorzubereiten, kann er in ein ActivityBuilder geladen werden, und anschließend wird ActivityBuilder in DynamicUpdateServices.PrepareForUpdate übergeben.
Hinweis
Weitere Informationen zum Arbeiten mit serialisierten Workflows und ActivityBuilderzum Serialisieren von Workflows und Aktivitäten zu und von XAML finden Sie unter "Serialisieren von Workflows und Aktivitäten".
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. Nachdem die Methode zurückgegeben wurde, enthält die ActivityBuilder sowohl die ursprüngliche Workflowdefinition als auch eine Kopie.
// 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);
Aktualisieren der Workflowdefinition, um die gewünschten Änderungen widerzuspiegeln
Sobald die Workflowdefinition für die Aktualisierung vorbereitet wurde, können die gewünschten Änderungen vorgenommen werden. 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ätsdelegatten vornehmen. Sie können eine laufende Aktivität nicht entfernen oder die Signatur eines laufenden Delegaten ändern. Diese Änderungen können mithilfe von Code oder in einem erneut gehosteten Workflow-Designer vorgenommen werden. Im folgenden Beispiel wird der Sequenz eine benutzerdefinierte VerifyAppraisal-Aktivität hinzugefügt, die den Textkörper des MortgageWorkflow aus dem vorherigen Beispiel bildet.
// 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);
Aktualisierungskarte erstellen
Sobald die vorbereitete Workflowdefinition geändert wurde, kann die Aktualisierungskarte erstellt werden. Zum Erstellen einer dynamischen Aktualisierungskarte wird die Methode DynamicUpdateServices.CreateUpdateMap aufgerufen. Dadurch wird ein DynamicUpdateMap Objekt zurückgegeben, das die Informationen enthält, die die Laufzeit benötigt, um eine beibehaltene Workflowinstanz zu ändern, sodass sie mit der neuen Workflowdefinition geladen und fortgesetzt werden kann. Im folgenden Beispiel wird eine dynamische Karte für die geänderte MortgageWorkflow-Definition aus dem vorherigen Beispiel erstellt.
// Create the update map.
DynamicUpdateMap map = DynamicUpdateServices.CreateUpdateMap(ab);
Diese Aktualisierungskarte kann sofort verwendet werden, um persistierte Workflow-Instanzen zu ändern, oder typischerweise kann sie gespeichert und die Updates später angewendet werden. Eine Möglichkeit, die Aktualisierungskarte zu speichern, besteht darin, sie in eine Datei zu serialisieren, wie im nachstehenden Beispiel gezeigt.
// 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ückkehrt, werden die geklonte Workflowdefinition und die im Aufruf zu DynamicUpdateServices.PrepareForUpdate hinzugefügten Informationen zu dynamischen Updates entfernt. Die geänderte Workflowdefinition kann gespeichert werden, damit sie später beim Fortsetzen aktualisierter Workflowinstanzen verwendet werden kann. Im folgenden Beispiel wird die geänderte Workflowdefinition in MortgageWorkflow_v1.1.xaml gespeichert.
// 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();
Wenden Sie die Aktualisierungskarte auf die gewünschten gespeicherten Workflow-Instanzen an
Die Updatezuordnung kann jederzeit angewendet werden, nachdem sie erstellt wurde. Es kann sofort mit der DynamicUpdateMap-Instanz durchgeführt werden, die von DynamicUpdateServices.CreateUpdateMap zurückgegeben wurde, oder es kann später mithilfe einer gespeicherten Kopie der Aktualisierungskarte erfolgen. Um eine Workflowinstanz zu aktualisieren, laden Sie sie unter Verwendung von WorkflowApplicationInstance in WorkflowApplication.GetInstance. Erstellen Sie dann eine WorkflowApplication mit der aktualisierten Workflow-Definition und dem gewünschten WorkflowIdentity. Dies WorkflowIdentity kann anders sein als der, der zum Speichern des ursprünglichen Workflows verwendet wurde. In der Regel ist dies der Fall, um widerzuspiegeln, dass die beibehaltene Instanz geändert wurde. NachdemWorkflowApplication erstellt wurde, wird sie mithilfe der Überladung von WorkflowApplication.Load, das DynamicUpdateMap verwendet, geladen und dann mit einem Aufruf von WorkflowApplication.Unload entladen. Dadurch wird die dynamische Aktualisierung angewendet und die aktualisierte Workflowinstanz beibehalten.
// 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 Workflowinstanz
Nachdem die dynamische Aktualisierung angewendet wurde, kann die Workflowinstanz fortgesetzt werden. Beachten Sie, dass die neue aktualisierte Definition WorkflowIdentity verwendet werden muss.
Hinweis
Weitere Informationen zum Arbeiten mit WorkflowApplication und WorkflowIdentityfinden Sie unter Verwenden von WorkflowIdentity und Versionsverwaltung.
Im folgenden Beispiel wurde der MortgageWorkflow_v1.1.xaml Workflow aus dem vorherigen Beispiel kompiliert und mithilfe der aktualisierten Workflowdefinition geladen und fortgesetzt.
// 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(...);