Używanie obiektu WorkflowIdentity i wersjonowanie

WorkflowIdentity Umożliwia deweloperom aplikacji przepływu pracy skojarzenie nazwy i elementu Version z definicją przepływu pracy oraz skojarzenie tych informacji z utrwalonego wystąpienia przepływu pracy. Te informacje o tożsamości mogą być używane przez deweloperów aplikacji przepływu pracy w celu umożliwienia scenariuszy, takich jak równoległe wykonywanie wielu wersji definicji przepływu pracy, i zapewnia podstawę dla innych funkcji, takich jak aktualizacja dynamiczna. Ten temat zawiera omówienie korzystania WorkflowIdentity z WorkflowApplication hostingu. Aby uzyskać informacje na temat równoległego wykonywania definicji przepływu pracy w usłudze przepływu pracy, zobacz Side by Side by Side Versioning in WorkflowServiceHost (Równoległe przechowywanie wersji w usłudze WorkflowServiceHost). Aby uzyskać informacje na temat aktualizacji dynamicznej, zobacz Aktualizacja dynamiczna.

W tym temacie

Korzystanie z elementu WorkflowIdentity

Aby użyć polecenia WorkflowIdentity, utwórz wystąpienie, skonfiguruj je i skojarz je z wystąpieniem WorkflowApplication . Wystąpienie WorkflowIdentity zawiera trzy informacje identyfikujące. Name i Version zawierają nazwę i Version i są wymagane, i Package jest opcjonalny i może służyć do określenia dodatkowego ciągu zawierającego informacje, takie jak nazwa zestawu lub inne żądane informacje. A WorkflowIdentity jest unikatowa, jeśli którakolwiek z jego trzech właściwości różni się od innej WorkflowIdentity.

Ważne

Element nie WorkflowIdentity powinien zawierać żadnych danych osobowych (PII). Informacje o używanym WorkflowIdentity do tworzenia wystąpienia są emitowane do dowolnych skonfigurowanych usług śledzenia w kilku różnych punktach cyklu życia aktywności przez środowisko uruchomieniowe. Śledzenie WF nie ma żadnego mechanizmu ukrywania danych pii (poufnych danych użytkownika). WorkflowIdentity W związku z tym wystąpienie nie powinno zawierać żadnych danych pii, ponieważ będzie ono emitowane przez środowisko uruchomieniowe w rekordach śledzenia i może być widoczne dla każdego, kto ma dostęp do wyświetlania rekordów śledzenia.

W poniższym przykładzie WorkflowIdentity obiekt jest tworzony i skojarzony z wystąpieniem przepływu pracy utworzonego MortgageWorkflow przy użyciu definicji przepływu pracy.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Podczas ponownego ładowania i wznawiania przepływu pracy WorkflowIdentity należy użyć elementu skonfigurowanego do dopasowania WorkflowIdentity do utrwalonego wystąpienia przepływu pracy.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

WorkflowIdentity Jeśli element używany podczas ponownego ładowania wystąpienia przepływu pracy nie jest zgodny z utrwałym WorkflowIdentityelementem VersionMismatchException , jest zgłaszany. W poniższym przykładzie próba załadowania jest podejmowana na wystąpieniu MortgageWorkflow , które zostało utrwalone w poprzednim przykładzie. Ta próba załadowania jest podejmowana przy użyciu skonfigurowanej WorkflowIdentity dla nowszej wersji przepływu pracy kredytu hipotecznego, który nie pasuje do utrwalonego wystąpienia.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

Po wykonaniu poprzedniego kodu zostanie zgłoszony następujący VersionMismatchException kod.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

Wykonywanie równoległe przy użyciu elementu WorkflowIdentity

WorkflowIdentity umożliwia równoległe wykonywanie wielu wersji przepływu pracy. Jednym z typowych scenariuszy jest zmiana wymagań biznesowych w długotrwałym przepływie pracy. W przypadku wdrożenia zaktualizowanej wersji można uruchomić wiele wystąpień przepływu pracy. Aplikację hosta można skonfigurować tak, aby używała zaktualizowanej definicji przepływu pracy podczas uruchamiania nowych wystąpień, a aplikacja hosta jest odpowiedzialna za podanie prawidłowej definicji przepływu pracy podczas wznawiania wystąpień. WorkflowIdentity umożliwia identyfikowanie i dostarczanie zgodnej definicji przepływu pracy podczas wznawiania wystąpień przepływu pracy.

Aby pobrać WorkflowIdentity utrwalone wystąpienie przepływu pracy, GetInstance używana jest metoda . Metoda GetInstance pobiera Id utrwalone wystąpienie przepływu pracy i SqlWorkflowInstanceStore obiekt, który zawiera utrwalone wystąpienie i zwraca element WorkflowApplicationInstance. Element WorkflowApplicationInstance zawiera informacje o trwałym wystąpieniu przepływu pracy, w tym o skojarzonym z WorkflowIdentitynim wystąpieniu . To skojarzone WorkflowIdentity może być używane przez hosta do podawania prawidłowej definicji przepływu pracy podczas ładowania i wznawiania wystąpienia przepływu pracy.

Uwaga

Wartość null WorkflowIdentity jest prawidłowa i może być używana przez hosta do mapowania wystąpień, które zostały utrwalone bez skojarzenia z WorkflowIdentity właściwą definicją przepływu pracy. Ten scenariusz może wystąpić, gdy aplikacja przepływu pracy nie została początkowo napisana z obsługą wersji przepływu pracy lub gdy aplikacja zostanie uaktualniona z programu .NET Framework 4. Aby uzyskać więcej informacji, zobacz Uaktualnianie baz danych trwałości programu .NET Framework 4 do obsługi przechowywania wersji przepływu pracy.

W poniższym przykładzie element jest Dictionary<WorkflowIdentity, Activity> używany do kojarzenia WorkflowIdentity wystąpień z ich pasującymi definicjami przepływu pracy, a przepływ pracy jest uruchamiany przy użyciu MortgageWorkflow definicji przepływu pracy, która jest skojarzona z identityV1WorkflowIdentity.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

W poniższym przykładzie informacje o utrwalionym wystąpieniu przepływu pracy z poprzedniego przykładu są pobierane przez wywołanie metody GetInstance, a utrwalone WorkflowIdentity informacje są używane do pobierania zgodnej definicji przepływu pracy. Te informacje służą do konfigurowania WorkflowApplicationelementu , a następnie są ładowane przepływy pracy. Należy pamiętać, że ponieważ Load przeciążenie, które pobiera WorkflowApplicationInstance element, SqlWorkflowInstanceStore jest używane WorkflowApplication przez właściwość , a WorkflowApplicationInstance więc jej InstanceStore właściwość nie musi być skonfigurowana.

Uwaga

InstanceStore Jeśli właściwość jest ustawiona, musi być ustawiona z tym samym SqlWorkflowInstanceStore wystąpieniem używanym przez WorkflowApplicationInstance obiekt lub , a ArgumentException w przeciwnym razie zostanie zgłoszony następujący komunikat: The instance is configured with a different InstanceStore than this WorkflowApplication..

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

Uaktualnianie baz danych trwałości programu .NET Framework 4 w celu obsługi obsługi wersji przepływu pracy

Skrypt bazy danych SqlWorkflowInstanceStoreSchemaUpgrade.sql jest udostępniany do uaktualniania baz danych trwałości utworzonych przy użyciu skryptów bazy danych programu .NET Framework 4. Ten skrypt aktualizuje bazy danych w celu obsługi nowych możliwości przechowywania wersji wprowadzonych w programie .NET Framework 4.5. Wszystkie utrwalone wystąpienia przepływu pracy w bazach danych mają domyślne wartości przechowywania wersji, a następnie mogą uczestniczyć w wykonywaniu równoległym i aktualizacji dynamicznej.

Jeśli aplikacja przepływu pracy programu .NET Framework 4.5 próbuje wykonać wszelkie operacje trwałości, które używają nowych funkcji przechowywania wersji w bazie danych trwałości, która nie została uaktualniona przy użyciu podanego skryptu, InstancePersistenceCommandException zostanie zgłoszony komunikat podobny do poniższego komunikatu.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

Aby uaktualnić schemat bazy danych

  1. Otwórz program SQL Server Management Studio i połącz się z serwerem bazy danych trwałości, na przykład .\SQLEXPRESS.

  2. Wybierz pozycję Otwórz, Plik z menu Plik . Przejdź do następującego folderu: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Wybierz SqlWorkflowInstanceStoreSchemaUpgrade.sql i kliknij przycisk Otwórz.

  4. Wybierz nazwę bazy danych trwałości na liście rozwijanej Dostępne bazy danych .

  5. Wybierz pozycję Wykonaj z menu Zapytanie .

Po zakończeniu zapytania schemat bazy danych zostanie uaktualniony i w razie potrzeby można wyświetlić domyślną tożsamość przepływu pracy przypisaną do utrwalonego wystąpienia przepływu pracy. Rozwiń bazę danych trwałości w węźle Bazy danych Eksplorator obiektów, a następnie rozwiń węzeł Widoki. Kliknij prawym przyciskiem myszy pozycję System.Activities.DurableInstancing.Instances i wybierz pozycję Wybierz 1000 pierwszych wierszy. Przewiń do końca kolumn i zwróć uwagę, że do widoku dodano sześć dodatkowych kolumn: IdentityName, IdentityPackage, Build, Major, Minor i Revision. Wszystkie utrwalone przepływy pracy będą miały wartość NULL dla tych pól, reprezentującą tożsamość przepływu pracy o wartości null.