Partager via


Composite personnalisé à l'aide de NativeActivity

Cette rubrique s'applique à Windows Workflow Foundation 4.

Cet exemple montre comment écrire un NativeActivity qui planifie d'autres objets Activity pour contrôler le flux d'exécution d'un workflow. Cet exemple utilise deux flux de contrôle communs, Sequence et While, pour illustrer cette procédure.

Détails de l'exemple

Depuis MySequence, il est à noter tout d'abord qu'il dérive de NativeActivity. NativeActivity est l'objet Activity qui expose la totalité du ActivityRuntime via le NativeActivityContext passé à la méthode Execute.

MySequence expose une collection publique d'objets Activity qui est remplie par l'auteur de workflow. Avant que le workflow ne soit exécuté, l'exécution du workflow appelle la méthode CacheMetadata sur chaque activité dans un workflow. Pendant ce processus, l'exécution établit des relations parent-enfant pour la portée des données et la gestion de la durée de vie. L'implémentation par défaut de la méthode CacheMetadata utilise la classe d'instance TypeDescriptor pour l'activité MySequence pour ajouter toute propriété publique de type Activity ou IEnumerable<Activity> comme enfants de l'activité MySequence.

Chaque fois qu'une activité expose une collection publique d'activités enfants, il est probable que ces activités enfants partagent l'état. Il est recommandé à l'activité parent, dans ce cas MySequence, d'exposer également une collection de variables par le biais desquelles les activités enfants peuvent y parvenir. Comme les activités enfants, la méthode CacheMetadata ajoute des propriétés publiques de type Variable ou IEnumerable<Variable> comme variables associées à l'activité MySequence.

Outre les variables publiques, manipulées par les enfants de MySequence, MySequence doit également effectuer le suivi de sa situation dans l'exécution de ses enfants. Il utilise une variable privée, currentIndex, pour ce faire. Cette variable est inscrite dans le cadre de l'environnement MySequence en ajoutant un appel à la méthode AddImplementationVariable dans la méthode CacheMetadata de l'activité MySequence. Les objets Activity ajoutés à la collection MySequence ``Activities ne peuvent pas accéder aux variables ajoutées de cette façon.

Lorsque MySequence est exécuté par l'exécution, l'exécution appelle sa méthode Execute, en lui passant un NativeActivityContext. Le NativeActivityContext est le proxy de l'activité de retour dans l'exécution pour la suppression des références des arguments et des variables ainsi que la planification d'autres objets Activity, ou ActivityDelegates. MySequence utilise une méthode InternalExecute pour encapsuler la logique de planification du premier enfant et de tous les enfants suivants dans une méthode unique. Il commence par supprimer la référence du currentIndex. S'il est égal au nombre dans la collection Activities, la séquence est terminée, l'activité est retournée sans planifier de travail et l'exécution la déplace dans l'état Closed. Si le currentIndex est inférieur au nombre d'activités, l'enfant suivant est obtenu à partir de la collection Activities et MySequence appelle ScheduleActivity, en passant l'enfant à planifier et un CompletionCallback qui pointe vers la méthode InternalExecute. Enfin, le currentIndex est incrémenté et le contrôle est répercuté dans l'exécution. Tant qu'une instance de MySequence a un objet Activity enfant planifié, l'exécution le considère comme étant dans l'état Exécution.

Lorsque l'activité enfant est terminée, le CompletionCallback est exécuté. La boucle continue à partir du haut. Comme Execute, un CompletionCallback prend un ActivityExecutionContext, en donnant à l'implémenteur l'accès à l'exécution.

MyWhile est différent de MySequence, car il planifie un seul objet Activity à plusieurs reprises et il utilise un Activity<bool> nommé Condition pour déterminer si cette planification doit avoir lieu. Comme MySequence, MyWhile utilise une méthode InternalExecute pour centraliser sa logique de planification. Il planifie le Condition Activity<bool> avec un CompletionCallback<bool> nommé OnEvaluationCompleted. Lorsque l'exécution de Condition est effectuée, son résultat devient disponible via ce CompletionCallback dans un paramètre fortement typé nommé result. Si la valeur est true, MyWhile appelle ScheduleActivity, en passant l'objet Body Activity et InternalExecute comme CompletionCallback. Lorsque l'exécution de Body est terminée, Condition est de nouveau planifié dans InternalExecute, en recommençant la boucle à zéro. Lorsque le Condition retourne la valeur false, une instance de MyWhile rend le contrôle à l'exécution sans planifier le Body et l'exécution le déplace dans l'état Closed.

Pour configurer, générer et exécuter l'exemple

  1. Ouvrez l'exemple de solution Composite.sln dans Visual Studio 2010.

  2. Générez et exécutez la solution.

Dd759031.Important(fr-fr,VS.100).gif Remarque :
Les exemples peuvent déjà être installés sur votre ordinateur. Recherchez le répertoire (par défaut) suivant avant de continuer.

<LecteurInstall>:\WF_WCF_Samples

Si ce répertoire n'existe pas, rendez-vous sur la page (éventuellement en anglais) des exemples Windows Communication Foundation (WCF) et Windows Workflow Foundation (WF) pour .NET Framework 4 pour télécharger tous les exemples Windows Communication Foundation (WCF) et WF. Cet exemple se trouve dans le répertoire suivant.

<LecteurInstall>:\WF_WCF_Samples\WF\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity