Предоставление данных с помощью CacheMetadata
Перед выполнением действия среда выполнения рабочих процессов получает все сведения, которые необходимы для его поддержки. Среда выполнения получает эти данные во время выполнения метода CacheMetadata. Реализация этого метода по умолчанию предоставляет среде выполнения все открытые аргументы, переменные и дочерние действия этого действия, доступные во время выполнения. Если действие требует передачи среде выполнения дополнительных сведений (например, закрытых элементов или действий, планируемых этим действием), то этот метод может быть переопределен.
Поведение CacheMetadata по умолчанию
Реализация CacheMetadata по умолчанию для действий, производных от NativeActivity, обрабатывает следующие типы методов следующими способами:
InArgument<T>, OutArgument<T> или InOutArgument<T> (универсальные аргументы). Эти аргументы доступны в среде выполнения с именем и типом, совпадающими с именем и типом переданного свойства, с соответствующим направлением аргумента и некоторыми проверочными данными.
Variable или любой его подкласс. Эти элементы предоставляются среде выполнения в виде открытых переменных.
Activity или любой его подкласс. Эти элементы предоставляются среде выполнения в виде открытых дочерних действий. Поведение по умолчанию можно реализовать явно путем вызова AddImportedChild, передавая дочернее действие.
ActivityDelegate или любой его подкласс. Эти элементы доступны в среде выполнения в виде открытых делегатов.
ICollection типа Variable. Все элементы коллекции передаются среде выполнения в виде открытых переменных.
ICollection типа Activity. Все элементы коллекции передаются среде выполнения в виде открытых дочерних действий.
ICollection типа ActivityDelegate. Все элементы коллекции передаются среде выполнения в виде открытых делегатов.
CacheMetadata для действий, производных от Activity, CodeActivity и AsyncCodeActivity, работают, как описано выше, за исключением следующих отличий.
Классы, производные от Activity, не могут планировать дочерние действия или делегаты, поэтому такие элементы предоставляются в виде импортируемых дочерних действий и делегатов.
Классы, производные от CodeActivity и AsyncCodeActivity, не поддерживают переменные, дочерние элементы и делегаты, поэтому передаваться могут только аргументы.
Переопределение метода CacheMetadata для передачи данных среде выполнения
В следующем фрагменте кода показано, как добавить сведения об элементах в метаданные любого действия во время выполнения метода CacheMetadata. Следует иметь в виду, что основа метода вызывается для кэширования всех открытых данных о действии.
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
Чтобы передать данные дочерним действиям, которые должны быть запланированы действием с помощью переменных, необходимо добавить переменные в виде переменных реализации. Значения открытых переменных нельзя задать таким образом. Причина этого заключается в том, что действия должны выполняться скорее как реализации функций (имеющих параметры), а не как инкапсулированные классы (имеющие свойства). Однако в некоторых ситуациях аргументы должны задаваться явным образом, например через ScheduleActivity, поскольку запланированное действие, в отличие от дочернего, не имеет доступа к аргументам родительского действия.
В следующем фрагменте кода показано, как передать аргумент из собственного действия в запланированное действие с помощью 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);
}
}