Обязательные аргументы и группы перегруженных аргументов
Действия можно настроить таким образом, чтобы для их выполнения требовалась привязка определенных аргументов. Атрибут RequiredArgument
указывает, что для действия необходимы определенные аргументы, а атрибут OverloadGroup
используется для группирования категорий необходимых аргументов. С помощью атрибутов авторы действий могут реализовать простые или сложные конфигурации проверки правильности действий.
Использование обязательных аргументов
Чтобы использовать атрибут RequiredArgument
в действии, укажите необходимые аргументы с помощью RequiredArgumentAttribute. В этом примере действие Add
определено, как имеющее два обязательных аргумента.
public sealed class Add : CodeActivity<int>
{
[RequiredArgument]
public InArgument<int> Operand1 { get; set; }
[RequiredArgument]
public InArgument<int> Operand2 { get; set; }
protected override int Execute(CodeActivityContext context)
{
return Operand1.Get(context) + Operand2.Get(context);
}
}
В XAML необходимые аргументы также обозначаются с помощью RequiredArgumentAttribute. В данном примере действие Add
определено с помощью трех аргументов и использует действие Assign<T> для выполнения операции сложения.
<Activity x:Class="ValidationDemo.Add" ...>
<x:Members>
<x:Property Name="Operand1" Type="InArgument(x:Int32)">
<x:Property.Attributes>
<RequiredArgumentAttribute />
</x:Property.Attributes>
</x:Property>
<x:Property Name="Operand2" Type="InArgument(x:Int32)">
<x:Property.Attributes>
<RequiredArgumentAttribute />
</x:Property.Attributes>
</x:Property>
<x:Property Name="Result" Type="OutArgument(x:Int32)" />
</x:Members>
<Assign>
<Assign.To>
<OutArgument x:TypeArguments="x:Int32">[Result]</OutArgument>
</Assign.To>
<Assign.Value>
<InArgument x:TypeArguments="x:Int32">[Operand1 + Operand2]</InArgument>
</Assign.Value>
</Assign>
</Activity>
При использовании действия, если любой из необходимых аргументов не привязан, будет возвращена следующая ошибка проверки.
Значение для требуемого аргумента действия "Operand1" не было предоставлено.
Примечание.
Дополнительные сведения о проверка для ошибок и предупреждений проверки см. в разделе "Вызов проверки действия".
Использование групп перегрузки
Группы перегрузки предоставляют метод, позволяющий определить, какие комбинации аргументов допустимы для действия. Аргументы группируются с помощью OverloadGroupAttribute. Каждой группе присваивается имя, указанное параметром OverloadGroupAttribute. Действие допустимо, если привязан только один набор аргументов в группе перегрузки. В следующем примере определяется класс CreateLocation
.
class CreateLocation: Activity
{
[RequiredArgument]
public InArgument<string> Name { get; set; }
public InArgument<string> Description { get; set; }
[RequiredArgument]
[OverloadGroup("G1")]
public InArgument<int> Latitude { get; set; }
[RequiredArgument]
[OverloadGroup("G1")]
public InArgument<int> Longitude { get; set; }
[RequiredArgument]
[OverloadGroup("G2")]
[OverloadGroup("G3")]
public InArgument<string> Street { get; set; }
[RequiredArgument]
[OverloadGroup("G2")]
public InArgument<string> City { get; set; }
[RequiredArgument]
[OverloadGroup("G2")]
public InArgument<string> State { get; set; }
[RequiredArgument]
[OverloadGroup("G3")]
public InArgument<int> Zip { get; set; }
}
Задача данного действия - указать местоположение в США. Для этого пользователь действия может указать местоположение с помощью одной из трех групп аргументов. Чтобы указать допустимые сочетания аргументов, определены 3 группы перегрузки. G1
содержит аргументы Latitude
и Longitude
. G2
содержит Street
, City
и State
. G3
содержит Street
и Zip
. Name
также является обязательным аргументом, но не входит в группу перегрузки. Чтобы данное действие было допустимым, Name
должно быть привязано вместе со всеми аргументами только из одной группы перегрузки.
В следующем примере, взятом из примера действий доступа к базе данных, существует две группы перегрузки: ConnectionString
и ConfigFileSectionName
. Чтобы данное действие было допустимым, должны быть связаны либо аргументы ProviderName
и ConnectionString
, либо аргумент ConfigName
, но не оба.
public class DbUpdate: AsyncCodeActivity
{
[RequiredArgument]
[OverloadGroup("ConnectionString")]
[DefaultValue(null)]
public InArgument<string> ProviderName { get; set; }
[RequiredArgument]
[OverloadGroup("ConnectionString")]
[DependsOn("ProviderName")]
[DefaultValue(null)]
public InArgument<string> ConnectionString { get; set; }
[RequiredArgument]
[OverloadGroup("ConfigFileSectionName")]
[DefaultValue(null)]
public InArgument<string> ConfigName { get; set; }
[DefaultValue(null)]
public CommandType CommandType { get; set; }
[RequiredArgument]
public InArgument<string> Sql { get; set; }
[DependsOn("Sql")]
[DefaultValue(null)]
public IDictionary<string, Argument> Parameters { get; }
[DependsOn("Parameters")]
public OutArgument<int> AffectedRecords { get; set; }
}
При определении группы перегрузки:
Группа перегрузки не может быть подмножеством или эквивалентным набором другой группы перегрузки.
Примечание.
Существует одно исключение из данного правила. Если группа перегрузки является подмножеством другой группы перегрузки и подмножество содержит только аргументы, где
RequiredArgument
равенfalse
, то группа перегрузки допустима.Группы перегрузки могут пересекаться, но это приведет к ошибке, если пересечение групп содержит все обязательные аргументы одной или обеих групп. В предыдущем примере группы перегрузки
G2
иG3
перекрываются, но поскольку пересечение не содержит все аргументы одной или обеих групп, то это допустимо.
Если имеет место привязка аргументов в группе перегрузки:
Группа перегрузки считается связанной, если все аргументы
RequiredArgument
в этой группе - связанные.Если в группе нет ни одного аргумента
RequiredArgument
и хотя бы один аргумент связан, то группа также считается связанной.Возникает ошибка проверки, если ни одна из групп перегрузки не является связанной и при этом нет ни одной группы перегрузки без аргументов
RequiredArgument
.При наличии нескольких привязанных групп перегрузки возникнет ошибка, т. е. все обязательные аргументы в одной группе являются связанными и любой аргумент в другой группе перегрузки также связан.