2011-04-21 1 views
1

일부 장기 실행 데이터 처리를 처리하고 수시로 "어머니"활동으로 정보를 다시 보내는 WF4 활동 확장을 구현하려고합니다.활동 - 워크 플로 인스턴스 확장 일대일 관계

이 버전을 구현했지만 병렬 활동 컨텍스트에서이 활동을 사용하는 경우 문제가 있습니다. 아래의 코드에서 볼 수 있듯이, 액티비티는 책갈피를 생성하고 MyActivityExtension 객체를 호출 한 후에 동작합니다. MyActivity 클래스의 모든 인스턴스가 통신 할 MyActivityExtension의 다른 인스턴스를 갖기를 원합니다. 이 유형의 두 가지 활동이 하나의 워크 플로우 정의에서 순차적으로 사용되면 모든 것이 정상적으로 작동하고 확장 클래스에 대한 호출은 다른 오브젝트에 대해 수행되지만 하나의 활동이 실행을 시작하고 다른 활동이 유휴 상태이면 두 번째 활동은 다음과 같은 동일한 확장 인스턴스를 사용합니다. 헛된 것.

이하 간단한 코드 샘플을 추가했습니다. 액티비티 인스턴스와 액티비티 확장 인스턴스간에 일대일 관계를 부과 할 수있는 방법에 대한 아이디어가 있습니까?

이 알렉스에게, 사전에 감사

MyActivity 코드 :

protected override void Execute(NativeActivityContext context) 
    { 
     //Some data processing.... 

     //Obtain the activity extension 
     MyActivityExtension extension = context.GetExtension<MyActivityExtension >(); 


     string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString(); 
     var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed); 

     extension.ProcessData(bookmarkName); 
    } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     base.CacheMetadata(metadata); 
     metadata.AddDefaultExtensionProvider<MyActivityExtension >(() => new MyActivityExtension()); 
    } 

private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value) 
    { 
     //some data retrieving operations 
    } 

MyActivityExtension 코드 :

IWorkflowInstanceExtension은 하나의 내선 번호 하나에 워크 플로우 관련 있지만, 각 활동에 도움이
public class MyActivityExtension : IWorkflowInstanceExtension 
{ 
    private WorkflowInstanceProxy instance; 
    private Guid id; 

    public MyActivityExtension() 
    { 
     id = Guid.NewGuid(); 
    } 

    internal void ProcessData(string bookmarkName) 
    { 
     Console.WriteLine("My activity extension Id: " + id.ToString()); 

     //Some data processing 
    } 

    public IEnumerable<object> GetAdditionalExtensions() 
    { 
     return null; 
    } 

    public void SetInstance(WorkflowInstanceProxy instance) 
    { 
     this.instance = instance; 
    } 
} 

답변

1

, 발견 한대로 동일한 확장 프로그램을 공유하게됩니다. 각 액티비티에 대해 새로운 확장을 생성하는 것은 불가능합니다. 내가 할 수있는 일은 확장 기능을 새로운 개체를 반환하는 Create() 함수를 사용하는 일종의 확장 팩토리로 변경하는 것입니다.

protected override void Execute(NativeActivityContext context) 
    { 
     //Some data processing.... 

     //Obtain the activity extension 
     MyActivityExtensionFactory extensionFactory = context.GetExtension<MyActivityExtensionFactory >(); 
     MyActivityExtension extension = extensionFactory.Create(); 

     string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString(); 
     var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed); 

     extension.ProcessData(bookmarkName); 
    } 
+0

좋은 생각, 모리스 :

그래서 코드는 다음과 같을 것이다. 확장 팩토리를 구현하고 문제를 제거합니다. 고맙습니다 ! –