Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Před spuštěním aktivity získá runtime pracovního postupu všechny informace o aktivitě, které potřebuje k udržení jejího spuštění. Modul runtime pracovního postupu získá tyto informace během provádění CacheMetadata metody. Výchozí implementace této metody poskytuje prostředí runtime všechny veřejné argumenty, proměnné a podřízené aktivity, které aktivita zpřístupní v době svého provedení. Pokud potřebuje aktivita poskytnout prostředí runtime více informací, například soukromé členy nebo aktivity, které má aktivita naplánovat, lze tuto metodu přepsat, aby tyto informace poskytla.
Výchozí chování CacheMetadata
Výchozí implementace CacheMetadata pro aktivity, které jsou odvozeny z NativeActivity, zpracovává následující typy metod těmito způsoby:
InArgument<T>, OutArgument<T>nebo InOutArgument<T> (obecné argumenty): Tyto argumenty jsou zpřístupněny modulu runtime jako argumenty s názvem a typem, který se rovná názvu a typu vystavené vlastnosti, příslušnému směru argumentu a některým ověřovacím datům.
Variable nebo jakoukoliv její podtřídu: Tito členové jsou dostupní v modulu runtime jako veřejné proměnné.
Activity nebo jakékoli její podtřídy: Tito členové jsou vystaveni modulu runtime jako veřejné podřízené aktivity. Výchozí chování lze implementovat explicitně voláním AddImportedChild, předáním podřízené aktivity.
ActivityDelegate nebo jakákoli její podtřída: Členové jsou vystaveni modulu runtime jako veřejní delegáti.
ICollection typu Variable: Všechny prvky v kolekci jsou vystaveny modulu runtime jako veřejné proměnné.
ICollection typu Activity: Všechny prvky v kolekci jsou vystaveny modulu runtime jako veřejné podřízené položky.
ICollection typu ActivityDelegate: Všechny prvky v kolekci jsou zpřístupněny modulu runtime jako veřejné delegáty.
Pro aktivity CacheMetadata, které jsou odvozeny z Activity, CodeActivity a AsyncCodeActivity, také fungují jako výše, s výjimkou následujících rozdílů:
Třídy odvozené od Activity nemohou naplánovat podřízené aktivity ani delegáty, takže takoví členové jsou vystaveni jako importované podřízené aktivity a delegáti.
Třídy odvozené z CodeActivity a AsyncCodeActivity nepodporují proměnné, podřízené objekty ani delegáty, takže budou vystaveny pouze argumenty.
Přepsání CacheMetadata za účelem poskytování informací běhovému prostředí
Následující fragment kódu ukazuje, jak přidat informace o členech do metadat aktivity během provádění CacheMetadata metody. Všimněte si, že základní metoda se volá pro uložení všech veřejně přístupných dat o aktivitě do vyrovnávací paměti.
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);
}
Odhalení dětí implementace pomocí CacheMetadata
Aby bylo možné předat data podřízeným aktivitám, které mají být naplánovány aktivitou pomocí proměnných, je nutné přidat proměnné jako implementační proměnné; veřejné proměnné nemohou mít tyto hodnoty nastavené tímto způsobem. Důvodem je, že aktivity se mají spouštět více jako implementace funkcí (které mají parametry), nikoli zapouzdřené třídy (které mají vlastnosti). Existují však situace, kdy musí být argumenty explicitně nastaveny, například při použití ScheduleActivity, protože naplánovaná aktivita nemá přístup k argumentům nadřazené aktivity stejným způsobem jako podřízená aktivita.
Následující fragment kódu ukazuje, jak předat argument z nativní aktivity do naplánované aktivity pomocí 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);
}
}