Rozszerzalność magazynu
SqlWorkflowInstanceStore umożliwia użytkownikom podwyższenie poziomu niestandardowych właściwości specyficznych dla aplikacji, które mogą służyć do wykonywania zapytań dotyczących wystąpień w bazie danych trwałości. Działanie promowania właściwości powoduje, że wartość jest dostępna w specjalnym widoku w bazie danych. Te promowane właściwości (właściwości, które mogą być używane w zapytaniach użytkownika) mogą być prostymi typami, takimi jak Int64, Guid, String i DateTime lub serializowany typ binarny (bajt[]).
Klasa SqlWorkflowInstanceStore ma metodę Promote , której można użyć do podwyższenia poziomu właściwości jako właściwości, która może być używana w zapytaniach. Poniższy przykład to kompleksowe przykład rozszerzalności magazynu.
W tym przykładowym scenariuszu aplikacja do przetwarzania dokumentów (DP) zawiera przepływy pracy, z których każda używa niestandardowych działań do przetwarzania dokumentów. Te przepływy pracy mają zestaw zmiennych stanu, które muszą być widoczne dla użytkownika końcowego. Aby to osiągnąć, aplikacja DP udostępnia rozszerzenie wystąpienia typu PersistenceParticipant, które jest używane przez działania do dostarczania zmiennych stanu.
class DocumentStatusExtension : PersistenceParticipant { public string DocumentId; public string ApprovalStatus; public string UserName; public DateTime LastUpdateTime; }
Nowe rozszerzenie jest następnie dodawane do hosta.
static Activity workflow = CreateWorkflow(); WorkflowApplication application = new WorkflowApplication(workflow); DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension (); application.Extensions.Add(documentStatusExtension);
Aby uzyskać więcej informacji na temat dodawania niestandardowego uczestnika trwałości, zobacz przykład Uczestnicy trwałości .
Działania niestandardowe w aplikacji dp wypełniają różne pola stanu w metodzie Execute .
public override void Execute(CodeActivityContext context) { // ... context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid(); context.GetExtension<DocumentStatusExtension>().UserName = "John Smith"; context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved"; context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now(); // ... }
Gdy wystąpienie przepływu pracy osiągnie punkt trwałości, metoda CollectValues uczestnika trwałości DocumentStatusExtension zapisuje te właściwości w kolekcji danych trwałości.
class DocumentStatusExtension : PersistenceParticipant { const XNamespace xNS = XNamespace.Get("http://contoso.com/DocumentStatus"); protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues) { readWriteValues = new Dictionary<XName, object>(); readWriteValues.Add(xNS.GetName("UserName"), this.UserName); readWriteValues.Add(xNS.GetName("ApprovalStatus"), this.ApprovalStatus); readWriteValues.Add(xNS.GetName("DocumentId"), this.DocumentId); readWriteValues.Add(xNS.GetName("LastModifiedTime"), this.LastUpdateTime); writeOnlyValues = null; } // ... }
Uwaga
Wszystkie te właściwości są przekazywane do klasy SqlWorkflowInstanceStore przez platformę trwałości za pośrednictwem kolekcji SaveWorkflowCommand.InstanceData .
Aplikacja DP inicjuje magazyn wystąpień przepływu pracy SQL i wywołuje metodę Promote w celu podwyższenia poziomu tych danych.
SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); List<XName> variantProperties = new List<XName>() { xNS.GetName("UserName"), xNS.GetName("ApprovalStatus"), xNS.GetName("DocumentId"), xNS.GetName("LastModifiedTime") }; store.Promote("DocumentStatus", variantProperties, null);
Na podstawie tych informacji o promocji usługa SqlWorkflowInstanceStore umieszcza właściwości danych w kolumnach widoku InstancePromotedPromotedProperties .
Aby wysłać zapytanie do podzbioru danych z tabeli podwyższania poziomu, aplikacja DP dodaje dostosowany widok w górnej części widoku podwyższania poziomu.
create view [dbo].[DocumentStatus] with schemabinding as select P.[InstanceId] as [InstanceId], P.Value1 as [UserName], P.Value2 as [ApprovalStatus], P.Value3 as [DocumentId], P.Value4 as [LastUpdatedTime] from [System.Activities.DurableInstancing].[InstancePromotedProperties] as P where P.PromotionName = N'DocumentStatus' go
[System.Activities.DurableInstancing.InstancePromotedPromotedProperties] widok
Nazwa kolumny | Typ kolumny | opis |
---|---|---|
InstanceId | Identyfikator GUID | Wystąpienie przepływu pracy, do którego należy ta promocja. |
PromotionName | nvarchar(400) | Nazwa samej promocji. |
Value1, Value2, Value3,..,Value32 | Sql_variant | Wartość promowanej właściwości. Większość typów danych pierwotnych SQL z wyjątkiem binarnych obiektów blob i ciągów o długości ponad 8000 bajtów może mieścić się w sql_variant. |
Value33, Value34, Value35, ..., Value64 | Varbinary(max) | Wartość promowanych właściwości, które są jawnie zadeklarowane jako varbinary(max). |