Rozšiřitelnost úložiště
SqlWorkflowInstanceStore umožňuje uživatelům zvýšit úroveň vlastních vlastností specifických pro aplikaci, které lze použít k dotazování na instance v databázi trvalosti. Povýšení vlastnosti způsobí, že hodnota bude k dispozici v rámci zvláštního zobrazení v databázi. Tyto upřednostněné vlastnosti (vlastnosti, které lze použít v uživatelských dotazech), můžou být jednoduché typy, jako jsou Int64, Guid, String a DateTime nebo serializovaný binární typ (bajt[]).
Třída SqlWorkflowInstanceStore má metodu Promote , kterou můžete použít k povýšení vlastnosti jako vlastnosti, kterou lze použít v dotazech. Následující příklad je kompletním příkladem rozšiřitelnosti úložiště.
V tomto ukázkovém scénáři má aplikace pro zpracování dokumentů pracovní postupy, z nichž každá používá vlastní aktivity ke zpracování dokumentů. Tyto pracovní postupy mají sadu stavových proměnných, které je potřeba zpřístupnit koncovému uživateli. K dosažení tohoto cíle aplikace DP poskytuje rozšíření instance typu PersistenceParticipant, které jsou používány aktivitami k poskytování stavových proměnných.
class DocumentStatusExtension : PersistenceParticipant { public string DocumentId; public string ApprovalStatus; public string UserName; public DateTime LastUpdateTime; }
Nové rozšíření se pak přidá do hostitele.
static Activity workflow = CreateWorkflow(); WorkflowApplication application = new WorkflowApplication(workflow); DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension (); application.Extensions.Add(documentStatusExtension);
Další podrobnosti o přidání vlastního účastníka trvalosti najdete v ukázce Účastníci trvalosti.
Vlastní aktivity v aplikaci DP naplní různá stavová pole v metodě 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(); // ... }
Když instance pracovního postupu dosáhne bodu trvalosti, CollectValues Metoda DocumentStatusExtension trvalost účastníka uloží tyto vlastnosti do kolekce dat trvalosti.
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; } // ... }
Poznámka:
Všechny tyto vlastnosti se předávají sqlWorkflowInstanceStore architekturou trvalosti prostřednictvím kolekce SaveWorkflowCommand.InstanceData.
Aplikace DP inicializuje úložiště instancí pracovního postupu SQL a vyvolá metodu Zvýšení úrovně pro zvýšení úrovně těchto dat.
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 základě těchto informací o povýšení sqlWorkflowInstanceStore umístí vlastnosti dat do sloupců zobrazení InstancePromotedProperties .
Pokud chcete dotazovat podmnožinu dat z tabulky povýšení, aplikace DP přidá do zobrazení povýšení přizpůsobené zobrazení.
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.InstancePromotedProperties] zobrazení
Název sloupce | Typ sloupce | Popis |
---|---|---|
InstanceId | Identifikátor GUID | Instance pracovního postupu, do které tento povýšení patří. |
PromotionName | nvarchar(400) | Název samotného povýšení. |
Hodnota1, Hodnota2, Hodnota3,..,Value32 | Sql_variant | Hodnota samotné upřednostněné vlastnosti. Většina primitivních datových typů SQL s výjimkou binárních objektů blob a řetězců s délkou více než 8 000 bajtů se může vejít do sql_variant. |
Hodnota33, Hodnota34, Hodnota35, ..., Hodnota64 | Varbinary(max) | Hodnota upřednostněných vlastností, které jsou explicitně deklarovány jako varbinary(max). |