Поделиться через


Обязательные аргументы и группы перегрузки

Действия можно настроить таким образом, чтобы определенные аргументы должны быть привязаны для действия, допустимого для выполнения. Атрибут 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; }
}

Цель этого действия — указать расположение в США. Для этого пользователь действия может указать расположение с помощью одной из трех групп аргументов. Чтобы указать допустимые сочетания аргументов, определяются три группы перегрузки. 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.
  • Это ошибка, связанная с несколькими группами перегрузки, то есть все необходимые аргументы в одной группе перегрузки привязаны, а любой аргумент в другой группе перегрузки также привязан.