Udostępnij za pomocą


Uwidacznianie danych za pomocą metody CacheMetadata

Przed wykonaniem działania środowisko uruchomieniowe przepływu pracy uzyskuje wszystkie informacje o działaniu, którego potrzebuje, aby zachować jego wykonanie. Środowisko uruchomieniowe przepływu pracy pobiera te informacje podczas wykonywania CacheMetadata metody. Domyślna implementacja tej metody dostarcza środowisku uruchomieniowemu wszystkie publiczne argumenty, zmienne i aktywności podrzędne udostępniane przez aktywność w momencie jej wykonania; Jeśli aktywność musi przekazać więcej informacji do środowiska uruchomieniowego niż to (na przykład prywatne elementy lub aktywności, które mają być zaplanowane przez tę aktywność), tę metodę można nadpisać, aby je przekazać.

Domyślne zachowanie CacheMetadata

Domyślna implementacja CacheMetadata dla działań wywodzących się z NativeActivity obsługuje następujące typy metod w następujący sposób:

  • InArgument<T>, OutArgument<T>lub InOutArgument<T> (argumenty ogólne): te argumenty są widoczne dla środowiska uruchomieniowego jako argumenty o nazwie i typie równym uwidocznionej nazwie i typowi właściwości, odpowiedniemu kierunku argumentu i niektórym danym weryfikacji.

  • Variable lub każdą jej podklasę: ci członkowie są eksponowani dla środowiska uruchomieniowego jako publiczne zmienne.

  • Activity lub wszelkie podklasy: te elementy członkowskie są udostępnione środowisku uruchomieniowemu jako publiczne czynności podrzędne. Domyślne zachowanie można zaimplementować jawnie, wywołując AddImportedChild, przekazując czynność podrzędną.

  • ActivityDelegate lub dowolna jej podklasa: Te elementy są udostępniane środowisku uruchomieniowemu jako delegaty publiczne.

  • ICollection typu Variable: wszystkie elementy w kolekcji są widoczne dla środowiska uruchomieniowego jako zmienne publiczne.

  • ICollection typu Activity: wszystkie elementy w kolekcji są widoczne dla środowiska uruchomieniowego jako publiczne dzieci.

  • ICollection typu ActivityDelegate: wszystkie elementy w kolekcji są widoczne dla środowiska uruchomieniowego jako delegaty publiczne.

Działania, które pochodzą z CacheMetadata, Activity oraz CodeActivity, dla AsyncCodeActivity również działają jak powyżej, z wyjątkiem następujących różnic:

  • Klasy pochodzące z Activity nie mogą planować działań podrzędnych ani delegatów, więc tacy członkowie są widoczni jako zaimportowani członkowie podrzędni i delegat.

  • Klasy pochodzące z CodeActivity i AsyncCodeActivity nie obsługują zmiennych, dzieci ani delegatów, więc zostaną ujawnione tylko argumenty.

Zastępowanie elementu CacheMetadata w celu dostarczenia informacji do środowiska uruchomieniowego

Poniższy fragment kodu przedstawia sposób dodawania informacji o członkach do metadanych aktywności podczas wykonania metody CacheMetadata. Należy pamiętać, że baza metody jest wywoływana w celu buforowania wszystkich danych publicznych dotyczących działania.

protected override void CacheMetadata(NativeActivityMetadata metadata)
{
    base.CacheMetadata(metadata);
    metadata.AddImplementationChild(this._writeLine);
    metadata.AddVariable(this._myVariable);
    metadata.AddImplementationVariable(this._myImplementationVariable);

    RuntimeArgument argument = new RuntimeArgument("MyArgument", ArgumentDirection.In, typeof(SomeType));
    metadata.Bind(argument, this.SomeName);
    metadata.AddArgument(argument);
}

Używanie metody CacheMetadata do uwidaczniania elementów podrzędnych implementacji

Aby przekazywać dane do działań podrzędnych, które mają być zaplanowane przez działanie przy użyciu zmiennych, należy dodać zmienne jako zmienne implementacji; zmienne publiczne nie mogą mieć ustawionych w ten sposób wartości. Przyczyną tego jest to, że działania mają być wykonywane bardziej jako implementacje funkcji (które mają parametry), a nie hermetyzowane klasy (które mają właściwości). Istnieją jednak sytuacje, w których argumenty muszą być jawnie ustawione, na przykład w przypadku używania ScheduleActivity metody, ponieważ zaplanowane działanie nie ma dostępu do argumentów działania nadrzędnego tak jak w przypadku działania podrzędnego.

Poniższy fragment kodu pokazuje, jak przekazać argument z działania natywnego do zaplanowanego działania przy użyciu polecenia CacheMetadata.

public sealed class ChildActivity : NativeActivity
{
    public WriteLine _writeLine;
    public InArgument<string> Message { get; set; }
    private Variable<string> MessageVariable { get; set; }
    public ChildActivity()
    {
        MessageVariable = new Variable<string>();
        _writeLine = new WriteLine
        {
            Text = new InArgument<string>(MessageVariable),
        };
    }
    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);
        metadata.AddImplementationVariable(this.MessageVariable);
        metadata.AddImplementationChild(this._writeLine);
    }
    protected override void Execute(NativeActivityContext context)
    {
        string configuredMessage = context.GetValue(Message);
        context.SetValue(MessageVariable, configuredMessage);
        context.ScheduleActivity(this._writeLine);
    }
}