Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Перед выполнением действия среда выполнения рабочего процесса получает все сведения о действии, необходимом для поддержания его выполнения. Среда выполнения рабочего процесса получает эти сведения во время выполнения CacheMetadata метода. Реализация этого метода по умолчанию предоставляет среду выполнения со всеми общедоступными аргументами, переменными и дочерними действиями, предоставляемыми действием во время выполнения; Если действие должно предоставить больше информации для среды выполнения (например, частных членов или действий, запланированных действием), этот метод можно переопределить, чтобы предоставить его.
Поведение кэшаMetadata по умолчанию
Стандартная реализация 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);
}
}