다음을 통해 공유


저장소 확장성

SqlWorkflowInstanceStore 를 사용하면 사용자가 지속성 데이터베이스의 인스턴스를 쿼리하는 데 사용할 수 있는 사용자 지정 애플리케이션별 속성을 승격할 수 있습니다. 속성을 프로모션하면 데이터베이스의 특별한 보기 내에서 값을 사용할 수 있습니다. 이러한 승격된 속성(사용자 쿼리에서 사용할 수 있는 속성)은 Int64, Guid, String, DateTime와 같은 단순 형식 또는 byte[]와 같은 직렬화된 이진 형식일 수 있습니다.

클래스에는 SqlWorkflowInstanceStore 메서드가 있어 속성을 쿼리에서 사용 가능한 속성으로 승격할 수 있습니다. 다음 예제는 저장소 확장성의 엔드 투 엔드 예제입니다.

  1. 이 예제 시나리오에서 DP(문서 처리) 애플리케이션에는 각각 문서 처리에 사용자 지정 작업을 사용하는 워크플로가 있습니다. 이러한 워크플로에는 최종 사용자에게 표시해야 하는 상태 변수 집합이 있습니다. 이를 위해 DP 애플리케이션은 활동에서 상태 변수를 제공하는 데 사용되는 형식 PersistenceParticipant의 인스턴스 확장을 제공합니다.

    class DocumentStatusExtension : PersistenceParticipant
    {
        public string DocumentId;
        public string ApprovalStatus;
        public string UserName;
        public DateTime LastUpdateTime;
    }
    
  2. 그런 다음 새 확장이 호스트에 추가됩니다.

    static Activity workflow = CreateWorkflow();
    WorkflowApplication application = new WorkflowApplication(workflow);
    DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension ();
    application.Extensions.Add(documentStatusExtension);
    

    사용자 지정 지속성 참가자를 추가하는 방법에 대한 자세한 내용은 지속성 참가자 샘플을 참조하세요.

  3. DP 애플리케이션의 사용자 지정 작업은 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();
        // ...
    }
    
  4. 워크플로 인스턴스가 지속성 지점에 도달하면 DocumentStatusExtension 지속성 참가자의 CollectValues 메서드는 이러한 속성을 지속성 데이터 컬렉션에 저장합니다.

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

    비고

    이러한 모든 속성은 SaveWorkflowCommand.InstanceData 컬렉션을 통해 지속성 프레임워크에 의해 SqlWorkflowInstanceStore에 전달됩니다.

  5. DP 애플리케이션은 SQL 워크플로 인스턴스 저장소를 초기화하고 Promote 메서드를 호출하여 이 데이터를 승격합니다.

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

    이 승격 정보를 기반으로 SqlWorkflowInstanceStoreInstancePromotedProperties 뷰의 열에 데이터 속성을 배치합니다.

  6. 승격 테이블에서 데이터의 하위 집합을 쿼리하기 위해 DP 애플리케이션은 승격 보기 위에 사용자 지정된 보기를 추가합니다.

    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] 보기

열 이름 열 형식 설명
인스턴스ID GUID 이 승격이 속한 워크플로 인스턴스입니다.
프로모션 이름 nvarchar(400) 프로모션 이름입니다.
Value1, Value2, Value3,..,Value32 sql_variant (SQL서버 데이터 유형 다양성) 승격된 속성 자체의 값입니다. 길이가 8000바이트를 넘는 이진 Blob 및 문자열을 제외한 대부분의 SQL 기본 데이터 형식은 sql_variant 적합할 수 있습니다.
Value33, Value34, Value35, ..., Value64 varbinary(max) varbinary(max)로 명시적으로 선언된 승격된 속성의 값입니다.