Aangepast samengesteld met systeemeigen activiteit
Het voorbeeld CustomCompositeNativeActivity laat zien hoe u een NativeActivity script schrijft waarmee andere Activity objecten worden gepland om de stroom van de uitvoering van een werkstroom te beheren. In dit voorbeeld worden twee algemene besturingsstromen, Reeks en While gebruikt om te laten zien hoe u dit doet.
Voorbeelddetails
Beginnend met MySequence
, het eerste wat u moet merken is dat het is afgeleid van NativeActivity. NativeActivity is het Activity object dat de volledige breedte van de werkstroomruntime beschikbaar maakt via de NativeActivityContext doorgegeven aan de Execute
methode.
MySequence
maakt een openbare verzameling objecten beschikbaar die worden ingevuld door de auteur van Activity de werkstroom. Voordat de werkstroom wordt uitgevoerd, roept de werkstroomruntime de CacheMetadata methode aan voor elke activiteit in een werkstroom. Tijdens dit proces brengt de runtime relaties tussen bovenliggende en onderliggende items tot stand voor gegevensbereiken en levensduurbeheer. De standaard implementatie van de CacheMetadata methode maakt gebruik van de TypeDescriptor instantieklasse voor de MySequence
activiteit om een openbare eigenschap van het type Activity of IEnumerableActivity<> als onderliggende eigenschap van de MySequence
activiteit toe te voegen.
Wanneer een activiteit een openbare verzameling onderliggende activiteiten beschikbaar maakt, is dit waarschijnlijk de status van de onderliggende activiteiten. Het is een best practice voor de bovenliggende activiteit, in dit geval MySequence
, om ook een verzameling variabelen beschikbaar te maken waarmee de onderliggende activiteiten dit kunnen doen. Net als onderliggende activiteiten voegt de CacheMetadata methode openbare eigenschappen van het type Variable of IEnumerableVariable<> als variabelen toe die aan de MySequence
activiteit zijn gekoppeld.
Naast de openbare variabelen, die worden gemanipuleerd door de onderliggende MySequence
variabelen, MySequence
moet ook bijhouden waar het zich in de uitvoering van de onderliggende elementen bevindt. Hiervoor wordt een privévariabele currentIndex
gebruikt. Deze variabele wordt geregistreerd als onderdeel van de MySequence
omgeving door een aanroep toe te voegen aan de methode binnen de AddImplementationVariable methode van CacheMetadata de MySequence
activiteit. De Activity objecten die aan de MySequence
Activities
verzameling zijn toegevoegd, hebben op deze manier geen toegang tot variabelen.
Wanneer MySequence
deze wordt uitgevoerd door de runtime, roept de runtime de methode aan Execute , waarbij een NativeActivityContext. Dit NativeActivityContext is de proxy van de activiteit terug in de runtime voor het deducteren van argumenten en variabelen, evenals het plannen van andere Activity objecten, of ActivityDelegates
. MySequence
gebruikt een InternalExecute
methode voor het inkapselen van de logica van het plannen van het eerste onderliggende element en alle volgende onderliggende elementen in één methode. Het begint met het uitstellen van de currentIndex
. Als deze gelijk is aan het aantal in de Activities
verzameling, wordt de reeks voltooid, wordt de activiteit geretourneerd zonder werk te plannen en wordt de runtime verplaatst naar de Closed status. Als het currentIndex
aantal activiteiten kleiner is dan het aantal activiteiten, wordt het volgende kind verkregen uit de Activities
verzameling en MySequence
aanroepen ScheduleActivity, waarbij het kind wordt doorgegeven dat moet worden gepland en een CompletionCallback die verwijst naar de InternalExecute
methode. Ten slotte wordt het currentIndex
verhoogd en wordt de controle teruggegeven aan de runtime. Zolang een exemplaar van MySequence
een onderliggend Activity object is gepland, beschouwt de runtime het als de uitvoeringsstatus.
Wanneer de onderliggende activiteit is voltooid, wordt deze CompletionCallback uitgevoerd. De lus gaat verder vanaf de bovenkant. Een neemt NativeActivityContexteen CompletionCallback Execute
, waardoor de implementeerfunctie toegang heeft tot de runtime.
MyWhile
verschilt van MySequence
het feit dat één object herhaaldelijk wordt gepland Activity en dat er een Activity<TResult><bool> met de naam Condition
wordt gebruikt om te bepalen of deze planning moet plaatsvinden. Net als MySequence
bij een MyWhile
methode wordt een InternalExecute
methode gebruikt om de planningslogica te centraliseren. Het plant de Condition
<Activitybool> met een bool> met de CompletionCallback<TResult><naam .OnEvaluationCompleted
Wanneer de uitvoering is Condition
voltooid, wordt het resultaat hiervan beschikbaar in CompletionCallback een sterk getypte parameter met de naam result
. Als true
, MyWhile
aanroepen ScheduleActivity, doorgeven in hetActivity Body
object en InternalExecute
als de CompletionCallback. Wanneer de uitvoering van Body
de bewerking is voltooid, Condition
wordt deze opnieuw InternalExecute
gepland en wordt de lus opnieuw gestart. Wanneer de Condition
retourneert false
, geeft een exemplaar van MyWhile
de runtime controle terug zonder de planning en Body
de runtime verplaatst deze naar de Closed status.
Het voorbeeld instellen, compileren en uitvoeren
Open de Composite.sln voorbeeldoplossing in Visual Studio.
Bouw de oplossing en voer deze uit.