Anpassad sammansatt med inbyggd aktivitet
Exemplet CustomCompositeNativeActivity visar hur du skriver en NativeActivity som schemalägger andra Activity objekt för att styra flödet för ett arbetsflödes körning. Det här exemplet använder två vanliga kontrollflöden, Sekvens och Medan, för att visa hur du gör detta.
Exempelinformation
Från och med MySequence
är det första att märka att det härleds från NativeActivity. NativeActivity är det Activity objekt som exponerar hela bredden av arbetsflödeskörningen via den NativeActivityContext som skickas Execute
till metoden.
MySequence
exponerar en offentlig samling Activity objekt som fylls i av arbetsflödesförfattaren. Innan arbetsflödet körs anropar arbetsflödeskörningen CacheMetadata metoden för varje aktivitet i ett arbetsflöde. Under den här processen etablerar körningen överordnade och underordnade relationer för dataomfång och livslängdshantering. Standardimplementeringen av CacheMetadata metoden använder TypeDescriptor instansklassen MySequence
för aktiviteten för att lägga till en offentlig egenskap av typen Activity ellerActivity> IEnumerable<som underordnade MySequence
aktiviteter.
När en aktivitet exponerar en offentlig samling underordnade aktiviteter är det troligt att dessa underordnade aktiviteter delar tillstånd. Det är bästa praxis för den överordnade aktiviteten, i det här fallet MySequence
, att också exponera en samling variabler genom vilka de underordnade aktiviteterna kan åstadkomma detta. Precis som underordnade aktiviteter CacheMetadata lägger metoden till offentliga egenskaper av typen Variable eller IEnumerable><Variablesom variabler som är associerade med MySequence
aktiviteten.
Förutom de offentliga variablerna, som manipuleras av barnen MySequence
i , MySequence
måste också hålla reda på var det är i körningen av sina barn. Den använder en privat variabel, currentIndex
, för att åstadkomma detta. Den här variabeln registreras som en del av MySequence
miljön genom att lägga till ett anrop till AddImplementationVariable metoden i MySequence
aktivitetens CacheMetadata metod. Objekten Activity som läggs till i MySequence
Activities
samlingen kan inte komma åt variabler som lagts till på det här sättet.
När MySequence
körs av körningen anropar körningen dess Execute metod och skickar in en NativeActivityContext. NativeActivityContext är aktivitetens proxy tillbaka till körningen för avreferering av argument och variabler samt schemaläggning av andra Activity objekt, eller ActivityDelegates
. MySequence
använder en InternalExecute
metod för att kapsla in logiken för att schemalägga det första underordnade och alla efterföljande underordnade i en enda metod. Det börjar med att dereferera currentIndex
. Om det är lika med antalet i Activities
samlingen är sekvensen klar, aktiviteten returneras utan att schemalägga något arbete och körningen flyttar den till Closed tillståndet. currentIndex
Om är mindre än antalet aktiviteter hämtas nästa underordnade från Activities
samlingen och MySequence
anropar ScheduleActivity, skickar in det underordnade som ska schemaläggas och ett CompletionCallback som pekar på InternalExecute
metoden. Slutligen currentIndex
ökas och kontrollen returneras tillbaka till körningen. Så länge en instans av MySequence
har ett underordnat Activity objekt schemalagt anser körningen att det är i körningstillståndet.
När den underordnade aktiviteten har slutförts körs den CompletionCallback . Loopen fortsätter uppifrån. Som Execute
, en CompletionCallback tar en NativeActivityContext, vilket ger implementeraren åtkomst till körningen.
MyWhile
skiljer sig från MySequence
i och med att det schemalägger ett enskilt Activity objekt upprepade gånger och använder en Activity<TResult><bool> med namnet Condition
för att avgöra om den här schemaläggningen ska ske. Som MySequence
använder MyWhile
en InternalExecute
metod för att centralisera sin schemaläggningslogik. Den schemalägger bool> medActivity<Condition
en<CompletionCallback<TResult> bool med> namnet .OnEvaluationCompleted
När körningen av Condition
har slutförts blir resultatet tillgängligt via detta CompletionCallback i en starkt typad parameter med namnet result
. Om true
anropar ScheduleActivityMyWhile
, skickar du objektet Body
Activity och InternalExecute
som CompletionCallback. När körningen av Body
slutförs schemaläggs Condition
du igen i InternalExecute
och startar loopen igen. Condition
När returnerar false
ger en instans av MyWhile
kontrollen tillbaka till körningen utan att Body
schemalägga och körningen flyttar den Closed till tillståndet.
Så här konfigurerar du, skapar och kör exemplet
Öppna den Composite.sln exempellösningen i Visual Studio.
Skapa och kör lösningen.