Delen via


Gegevens beschikbaar maken met CacheMetadata

Voordat u een activiteit uitvoert, verkrijgt de werkstroomruntime alle informatie over de activiteit die nodig is om de uitvoering ervan te behouden. De werkstroomruntime haalt deze informatie op tijdens de uitvoering van de CacheMetadata methode. De standaard implementatie van deze methode biedt de runtime alle openbare argumenten, variabelen en onderliggende activiteiten die worden weergegeven door de activiteit op het moment dat deze wordt uitgevoerd; als de activiteit meer informatie moet geven aan de runtime dan deze (zoals privéleden of activiteiten die door de activiteit moeten worden gepland), kan deze methode worden overschreven om deze op te geven.

Standaardgedrag van CacheMetadata

De standaard implementatie van CacheMetadata activiteiten die zijn afgeleid van NativeActivity processen, zijn de volgende methodetypen op de volgende manieren:

  • InArgument<T>, OutArgument<T>of InOutArgument<T> (algemene argumenten): deze argumenten worden als argumenten weergegeven als argumenten met een naam en type gelijk aan de naam en het type van de weergegeven eigenschap, de juiste argumentrichting en enkele validatiegegevens.

  • Variable of een subklasse daarvan: Deze leden worden blootgesteld aan de runtime als openbare variabelen.

  • Activity of een subklasse daarvan: Deze leden worden blootgesteld aan de runtime als openbare onderliggende activiteiten. Het standaardgedrag kan expliciet worden geïmplementeerd door aan te roepen AddImportedChild, waarbij de onderliggende activiteit wordt doorgegeven.

  • ActivityDelegate of een subklasse daarvan: Deze leden worden als openbare gedelegeerden blootgesteld aan de runtime.

  • ICollection van het type Variable: Alle elementen in de verzameling worden als openbare variabelen aan de runtime blootgesteld.

  • ICollection van het type Activity: Alle elementen in de verzameling worden als openbare onderliggende elementen aan de runtime blootgesteld.

  • ICollection van het type ActivityDelegate: Alle elementen in de verzameling worden als openbare gedelegeerden aan de runtime blootgesteld.

De CacheMetadata voor activiteiten die zijn afgeleid van Activity, CodeActivityen AsyncCodeActivity die ook werken zoals hierboven, met uitzondering van de volgende verschillen:

  • Klassen die zijn afgeleid van Activity kunnen geen onderliggende activiteiten of gemachtigden plannen, zodat dergelijke leden worden weergegeven als geïmporteerde kinderen en gemachtigden;

  • Klassen die zijn afgeleid van CodeActivity en AsyncCodeActivity die geen ondersteuning bieden voor variabelen, onderliggende elementen of gemachtigden, zodat alleen argumenten worden weergegeven.

CacheMetadata overschrijven om informatie te verstrekken aan de runtime

Het volgende codefragment laat zien hoe u informatie over leden toevoegt aan de metagegevens van een activiteit tijdens de uitvoering van de CacheMetadata methode. Houd er rekening mee dat de basis van de methode wordt aangeroepen om alle openbare gegevens over de activiteit in de cache op te cachen.

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

CacheMetadata gebruiken om onderliggende implementaties beschikbaar te maken

Om gegevens door te geven aan onderliggende activiteiten die moeten worden gepland door een activiteit met behulp van variabelen, is het noodzakelijk om de variabelen toe te voegen als implementatievariabelen; openbare variabelen kunnen hun waarden niet op deze manier instellen. De reden hiervoor is dat activiteiten meer moeten worden uitgevoerd als implementaties van functies (die parameters hebben), in plaats van ingekapselde klassen (die eigenschappen hebben). Er zijn echter situaties waarin de argumenten expliciet moeten worden ingesteld, zoals bij gebruik ScheduleActivity, omdat de geplande activiteit geen toegang heeft tot de argumenten van de bovenliggende activiteit op de manier waarop een onderliggende activiteit dat zou doen.

Het volgende codefragment laat zien hoe u een argument van een systeemeigen activiteit doorgeeft aan een geplande activiteit met behulp van 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);
    }
}