Megosztás:


Adatok felfedése a CacheMetadata használatával

Egy tevékenység végrehajtása előtt a munkafolyamat-futtatókörnyezet a végrehajtás fenntartásához szükséges összes információt lekéri a tevékenységről. A munkafolyamat-futtatókörnyezet ezeket az információkat a metódus végrehajtása CacheMetadata során kapja meg. A metódus alapértelmezett implementációja biztosítja a futtatókörnyezet számára a tevékenység által a végrehajtáskor közzétett összes nyilvános argumentumot, változót és gyermektevékenységet; ha a tevékenységnek ennél több információt kell adnia a futtatókörnyezetnek (például a privát tagoknak vagy a tevékenység által ütemezendő tevékenységeknek), ezt a módszert felül lehet bírálni annak biztosításához.

A CacheMetadata alapértelmezett viselkedése

A CacheMetadata folyamatokból származó tevékenységek alapértelmezett implementációja NativeActivity a következő módon dolgozza fel az alábbi metódustípusokat:

  • InArgument<T>, , OutArgument<T>vagy InOutArgument<T> (általános argumentumok): Ezek az argumentumok a futtatókörnyezet számára olyan argumentumokként jelennek meg, amelyek neve és típusa megegyezik a közzétett tulajdonság nevével és típusával, a megfelelő argumentum irányával és néhány érvényesítési adattal.

  • Variable vagy annak bármely alosztálya: Ezek a tagok nyilvános változókként vannak kitéve a futtatókörnyezetnek.

  • Activity vagy annak bármely alosztálya: Ezek a tagok nyilvános gyermektevékenységként vannak kitéve a futtatókörnyezetnek. Az alapértelmezett viselkedés kifejezetten implementálható úgy, hogy AddImportedChild-t meghívjuk, és átadjuk a gyermek aktivitást.

  • ActivityDelegate vagy annak bármely alosztálya: Ezek a tagok nyilvános delegáltként kerülnek a végrehajtókörnyezetbe.

  • ICollection típusú Variable: A gyűjtemény minden eleme nyilvános változóként jelenik meg a futtatókörnyezetben.

  • ICollection típusú Activity: A gyűjtemény minden eleme nyilvános gyermekként jelenik meg a futtatókörnyezetben.

  • ICollection típusú ActivityDelegate: A gyűjtemény minden eleme nyilvános meghatalmazottként jelenik meg a futtatókörnyezetben.

A CacheMetadata a Activity, CodeActivity és AsyncCodeActivity származó tevékenységekre ugyanúgy működnek, mint fent, kivéve a következő különbségeket:

  • Az osztályok, amelyek a Activity származnak, nem tudják ütemezni a gyermektevékenységeket vagy meghatalmazottakat, így az ilyen tagok importált gyermekként és meghatalmazottként vannak megjelenítve.

  • Azok az osztályok, amelyek a CodeActivity és a AsyncCodeActivity osztályokból származnak, nem támogatják a változókat, gyermekeket vagy delegáltakat, ezért csak az argumentumok lesznek közzétéve.

A CacheMetadata felülírása a futtatókörnyezet információinak megadásához

Az alábbi kódrészlet bemutatja, hogyan adhat hozzá információkat a tagokról egy tevékenység metaadataihoz a CacheMetadata metódus végrehajtása során. Vegye figyelembe, hogy a metódust arra hívják meg, hogy minden nyilvános adatot a tevékenységről tároljon.

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);
}

A CacheMetadata használata a megvalósítás gyerekeinek felfedése érdekében

Annak érdekében, hogy a változókat használó tevékenység ütemezze az adatokat a gyermektevékenységeknek, a változókat implementációs változókként kell hozzáadni; a nyilvános változók értékei nem állíthatók be így. Ennek az az oka, hogy a tevékenységeket inkább függvények implementációjaként (amelyek paraméterekkel rendelkeznek) hajtják végre, nem pedig beágyazott osztályokként (amelyek rendelkeznek tulajdonságokkal). Vannak azonban olyan helyzetek, amikor az argumentumokat explicit módon kell beállítani, például a ScheduleActivity használata során, mivel az ütemezett tevékenység nem fér hozzá a szülőtevékenység argumentumaihoz, mint ahogy egy gyermektevékenység tenné.

Az alábbi kódrészlet bemutatja, hogyan adhat át argumentumot natív tevékenységből egy ütemezett tevékenységbe a használatával 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);
    }
}