Niestandardowy element złożony przy użyciu działania Native
W przykładzie CustomCompositeNativeActivity pokazano, jak napisać obiektNativeActivity, który planuje inne Activity obiekty w celu kontrolowania przepływu wykonywania przepływu pracy. W tym przykładzie użyto dwóch typowych przepływów sterowania, Sequence i While, aby zademonstrować, jak to zrobić.
Przykładowe szczegóły
MySequence
Począwszy od elementu , pierwszą rzeczą, którą należy zauważyć, jest to, że pochodzi z elementu .NativeActivity NativeActivityActivity to obiekt, który uwidacznia pełną szerokość środowiska uruchomieniowego przepływu pracy za pośrednictwem przekazywanego Execute
NativeActivityContext do metody .
MySequence
Uwidacznia publiczną kolekcję Activity obiektów, które są wypełniane przez autora przepływu pracy. Przed wykonaniem przepływu pracy środowisko uruchomieniowe przepływu pracy wywołuje metodę CacheMetadata dla każdego działania w przepływie pracy. Podczas tego procesu środowisko uruchomieniowe ustanawia relacje nadrzędno-podrzędne na potrzeby określania zakresu danych i zarządzania okresem istnienia. Domyślna implementacja CacheMetadata metody używa TypeDescriptor klasy wystąpienia dla MySequence
działania, aby dodać dowolną publiczną właściwość typu Activity lub IEnumerableActivity<> jako elementy podrzędne MySequence
działania.
Za każdym razem, gdy działanie uwidacznia publiczną kolekcję działań podrzędnych, prawdopodobnie te działania podrzędne współużytkują stan. Jest to najlepsze rozwiązanie dla działania nadrzędnego, w tym przypadku MySequence
, aby uwidocznić również kolekcję zmiennych, za pomocą których działania podrzędne mogą to osiągnąć. Podobnie jak działania podrzędne, CacheMetadata metoda dodaje publiczne właściwości typu Variable lub IEnumerable><Variablejako zmienne skojarzone z działaniem.MySequence
Oprócz zmiennych publicznych, które są manipulowane przez elementy podrzędne MySequence
programu , MySequence
muszą również śledzić, gdzie znajduje się w wykonywaniu jego elementów podrzędnych. Używa zmiennej prywatnej , currentIndex
, aby to osiągnąć. Ta zmienna jest rejestrowana w ramach MySequence
środowiska przez dodanie wywołania do AddImplementationVariable metody w MySequence
metodzie działania CacheMetadata . Obiekty Activity dodane do kolekcji nie mogą uzyskiwać dostępu do MySequence
Activities
zmiennych dodanych w ten sposób.
Po MySequence
wykonaniu przez środowisko uruchomieniowe środowisko uruchomieniowe wywołuje jego Execute metodę, przekazując NativeActivityContextelement . Jest NativeActivityContext to serwer proxy działania z powrotem do środowiska uruchomieniowego w celu wyłudywania argumentów i zmiennych, a także planowania innych Activity obiektów lub ActivityDelegates
. MySequence
InternalExecute
używa metody do hermetyzacji logiki planowania pierwszego elementu podrzędnego i wszystkich kolejnych elementów podrzędnych w jednej metodzie. Zaczyna się od wyłudniania .currentIndex
Jeśli jest równa liczbie w Activities
kolekcji, sekwencja zostanie zakończona, działanie zostanie zwrócone bez planowania żadnej pracy, a środowisko uruchomieniowe przenosi je do Closed stanu . Jeśli wartość currentIndex
jest mniejsza niż liczba działań, następny element podrzędny jest uzyskiwany z Activities
kolekcji i MySequence
wywołuje ScheduleActivitymetodę , przekazując element podrzędny do zaplanowanych i wskazujący CompletionCallback metodę InternalExecute
. Na koniec element currentIndex
jest zwiększany, a kontrolka jest zwracana do środowiska uruchomieniowego. O ile wystąpienie obiektu podrzędnego MySequence
ma zaplanowany obiekt podrzędny Activity , środowisko uruchomieniowe uważa je za w stanie Wykonywanie.
Po zakończeniu działania podrzędnego CompletionCallback jest wykonywane. Pętla będzie kontynuowana od góry. Podobnie jak Execute
, element CompletionCallback przyjmuje element NativeActivityContext, dając implementatorowi dostęp do środowiska uruchomieniowego.
MyWhile
różni się od MySequence
tego, że planuje pojedynczy Activity obiekt wielokrotnie, a w nim używa wartości logicznej> Activity<TResult><o nazwie Condition
, aby określić, czy to planowanie powinno wystąpić. Podobnie jak MySequence
, MyWhile
używa InternalExecute
metody do scentralizowanej logiki planowania. Planuje wartość logiczną Condition
<Activity> z wartością logiczną<CompletionCallback<TResult>> o nazwie .OnEvaluationCompleted
Po zakończeniu Condition
wykonywania jego wynik staje się dostępny za pośrednictwem tego CompletionCallback w silnie typowanym parametrze o nazwie result
. Jeśli true
metoda MyWhile
wywołuje ScheduleActivitymetodę Body
Activity , przekazuje obiekt i InternalExecute
jako element CompletionCallback. Po zakończeniu Body
Condition
wykonywania programu program zostanie ponownie zaplanowany w InternalExecute
pliku , uruchamiając pętlę ponownie. Condition
Gdy funkcja zwraca false
wartość , wystąpienie MyWhile
polecenia daje kontrolę z powrotem do środowiska uruchomieniowego bez planowaniaBody
, a środowisko uruchomieniowe przenosi je do Closed stanu.
Aby skonfigurować, skompilować i uruchomić przykład
Otwórz przykładowe rozwiązanie Composite.sln w programie Visual Studio.
Skompiluj i uruchom rozwiązanie.