2010-12-01 4 views
3

Je souhaite créer une activité de workflow Windows composite (sous .NET 4) contenant une activité ReceiveAndSendReply prédéfinie. Certaines propriétés sont prédéfinies, mais d'autres (en particulier ServiceContractName) doivent être définies dans le concepteur.Définition des propriétés internes dans le composite WF4 Activités au moment du design

Je pourrais l'implémenter en tant que Template d'Activité (de la même manière que ReceiveAndSendReply est implémenté), mais je ne le ferais pas. Si je change plus tard le modèle, je devrais mettre à jour tous les flux de travail précédemment créés manuellement. Un modèle permettrait également à d'autres développeurs de modifier les propriétés qui devraient être corrigées.

Existe-t-il un moyen de le faire à partir d'une activité Xaml? Je n'ai pas trouvé un moyen d'attribuer une valeur Argument à une propriété d'une activité intégrée. Sinon, quelle technique suggérez-vous?

Répondre

6

Je n'ai pas fait cela en utilisant une activité XAML composite et je reçois quelques erreurs quand j'essaye mais en faisant cela par un NativeActivity n'est aucun problème. Voir l'exemple de code ci-dessous.

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

Bel exemple. Merci Maurice! Vous devriez vraiment envisager d'écrire un livre sur ce sujet ... – TrueWill

+1

Pensé à ce sujet, mais il ne vaut pas la peine. Le marché pour la plupart des livres .NET est petit, pour un livre WF4 son chemin à petit. Et il y en a déjà 3 là-bas. Je pense que je m'en tiendrai à l'enseignement et à la consultation :-) – Maurice

+0

J'aimerais voir comment accéder au paramètre firstName de l'activité _receive dans Execute(). –

Questions connexes