2010-12-01 4 views
3

Ich möchte eine zusammengesetzte Windows-Workflowaktivität (unter .NET 4) erstellen, die eine vordefinierte ReceiveAndSendReply-Aktivität enthält. Einige der Eigenschaften sind vordefiniert, andere (insbesondere ServiceContractName) müssen jedoch im Designer festgelegt werden.Festlegen interner Eigenschaften in zusammengesetzten WF4-Aktivitäten zur Entwurfszeit

Ich könnte dies als Activity Template implementieren (auf die gleiche Art wie ReceiveAndSendReply implementiert ist), würde aber eher nicht. Wenn ich später die Vorlage ändere, müsste ich alle zuvor erstellten Arbeitsabläufe manuell aktualisieren. Eine Vorlage würde anderen Entwicklern auch erlauben, Eigenschaften zu ändern, die behoben werden sollten.

Gibt es eine Möglichkeit, dies von einer Xaml-Aktivität aus zu tun? Ich habe keine Möglichkeit gefunden, einer Eigenschaft einer eingebetteten Aktivität einen Argumentwert zuzuweisen. Wenn nicht, welche Technik würden Sie vorschlagen?

Antwort

6

Ich habe dies nicht mit einer XAML-Verbundaktivität getan und erhalte einige Fehler, wenn ich es versuche, aber dies über eine NativeActivity zu tun ist kein Problem. Siehe den folgenden Beispielcode.

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

Schönes Beispiel. Danke Maurice! Sie sollten wirklich darüber nachdenken, ein Buch zu diesem Thema zu schreiben ... – TrueWill

+1

Dachte darüber nach, aber es ist die Mühe nicht wert. Der Markt für die meisten .NET-Bücher ist klein, für ein WF4-Buch ist es zu klein. Und da sind schon 3 draußen. Ich denke, ich bleibe beim Lehren und Beraten :-) – Maurice

+0

Würde gerne sehen, wie man auf den FirstName-Parameter der _receive-Aktivität in Execute() zugreifen kann. –

Verwandte Themen