Zveřejnění dat pomocí CacheMetadata
Před spuštěním aktivity modul runtime pracovního postupu získá všechny informace o aktivitě, kterou potřebuje, aby se zachovalo jeho 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 modul runtime se všemi veřejnými argumenty, proměnnými a podřízenými aktivitami vystavenými aktivitou v době, kdy je provedena; Pokud aktivita potřebuje poskytnout více informací modulu runtime než to (například soukromé členy nebo aktivity, které mají být naplánovány aktivitou), lze tuto metodu přepsat, aby ji poskytla.
Výchozí chování CacheMetadata
Výchozí implementace CacheMetadata aktivit odvozených z NativeActivity procesů následujících typů metod následujícími 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 podtřídu: Tito členové jsou vystaveni 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řídy: Tito členové jsou vystaveni modulu runtime jako veřejné delegáty.
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 CacheMetadata aktivity, které jsou odvozeny z Activity, CodeActivitya AsyncCodeActivity také fungují jako výše, s výjimkou následujících rozdílů:
Třídy, které nelze Activity naplánovat podřízené aktivity nebo delegáty, takže tito členové jsou vystaveni jako importované podřízené a delegáty;
Třídy odvozené z CodeActivityAsyncCodeActivity proměnných, podřízených objektů ani delegátů nepodporují, takže budou vystaveny pouze argumenty.
Přepsání CacheMetadata za účelem poskytnutí informací modulu runtime
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áklad metody je volána pro ukládání všech veřejných dat o aktivitě do mezipamě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);
}
Zveřejnění podřízených implementací 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 způsobem, jakým by 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);
}
}