2010-12-01 61 views
3

我想創建一個包含預定義的ReceiveAndSendReply活動的複合Windows工作流活動(在.NET 4下)。某些屬性是預定義的,但其他(特別是ServiceContractName)需要在設計器中設置。在設計時設置複合WF4活動的內部屬性

我可以實現這個作爲一個活動模板(與ReceiveAndSendReply實現相同的方式),但寧願不。如果稍後更改模板,我必須手動更新以前創建的所有工作流程。模板還可以允許其他開發人員更改應該修復的屬性。

有沒有辦法從Xaml活動做到這一點?我還沒有找到一種方法來將參數值分配給嵌入式Activity的屬性。如果不是,你會建議什麼技術?

回答

6

我沒有使用複合XAML活動來完成此操作,並且在嘗試通過NativeActivity執行操作時遇到了一些錯誤,這是沒有問題的。請參閱下面的示例代碼。

public class MyReceiveAndSendReply : NativeActivity 
{ 
    private Receive _receive; 
    private SendReply _sendReply; 

    public string ServiceContractName { get; set; } 
    public string OperationName { get; set; } 

    protected override bool CanInduceIdle 
    { 
     get { return true; } 
    } 

    protected override void CacheMetadata(NativeActivityMetadata metadata) 
    { 
     _receive = _receive ?? new Receive(); 
     _sendReply = _sendReply ?? new SendReply(); 
     _receive.CanCreateInstance = true; 
     metadata.AddImplementationChild(_receive); 
     metadata.AddImplementationChild(_sendReply); 

     _receive.ServiceContractName = ServiceContractName; 
     _receive.OperationName = OperationName; 

     var args = new ReceiveParametersContent(); 
     args.Parameters["firstName"] = new OutArgument<string>(); 
     _receive.Content = args; 

     _sendReply.Request = _receive; 

     var results = new SendParametersContent(); 
     results.Parameters["greeting"] = new InArgument<string>("Hello there"); 
     _sendReply.Content = results; 

     base.CacheMetadata(metadata); 
    } 

    protected override void Execute(NativeActivityContext context) 
    { 
     context.ScheduleActivity(_receive, ReceiveCompleted); 

    } 

    private void ReceiveCompleted(NativeActivityContext context, ActivityInstance completedInstance) 
    { 
     context.ScheduleActivity(_sendReply); 
    } 
} 
+0

不錯的例子。謝謝Maurice!你真的應該考慮寫一本書... – TrueWill 2010-12-02 17:18:24