2011-04-21 63 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代碼:

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

的IWorkflowInstanceExtension有助於一個擴展到一個工作流程關係,而且每個活動,因爲您發現將會共享相同的擴展名。沒有開箱即可爲每項活動創建新的擴展程序。我會做的就是用一個返回一個新對象的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

偉大的想法,莫里斯。我實施了擴建工廠並擺脫了這個問題。謝謝 ! – 2011-04-21 11:04:21