向自定义活动添加选项菜单配置

昨天,我写了有关如何使用 Visual Studio 调试自定义活动的文章。今天,我将介绍如何向选项菜单添加项目,以获取可以在一个 IP 中跨多个活动使用的可重用配置设置。这通常用于配置连接设置,或用于在多个活动中通用并且您不希望为每个活动反复输入的设置。

使用选项菜单配置的妙处在于,您可以将其用于单级级联依赖关系操作。例如,您可以基于用户对配置所作的选择来更改活动的输入、输出甚至主要功能。在本例中,我将介绍如何添加 ActivityConfiguration 项并使用它改变活动的工作方式。在下一篇文章中,我将介绍在使用命令性方法创建活动时,如何使用该项改变输入和输出。

在我昨天介绍的“Hello World”活动的基础上(在 https://orchestrator.codeplex.com 的 SDK 示例中),我创建了一个名为“Hello World 2”的新活动。还创建了一个名为“HelloWorldConfiguration”的新类,如下所示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Microsoft.SystemCenter.Orchestrator.Integration.Examples.HelloWorld2
{
    [ActivityData("Hello World Configuration")]
    public class HelloWorldConfiguration
    {
        private AlterationMethod _alterationType = AlterationMethod.None;

        public HelloWorldConfiguration()
        {
            AlterationType = AlterationMethod.None;
        }

        public HelloWorldConfiguration(AlterationMethod alterationType)
        {
            AlterationType = alterationType;
        }
            
        [ActivityInput]
        public AlterationMethod AlterationType
        {
            get { return _alterationType; }
            set { _alterationType = value; }
        }
    }

    public enum AlterationMethod
    {
        Reverse,
        Scramble,
        None
    };
    
}

此类定义一个数据结构,该数据结构用于定义配置选项和一个枚举,以允许用户选择值。下面是它的工作方式:

ActivityData 属性用于定义一个数据结构,该数据结构可用作该活动(或多个活动)的一个配置集。在此类中,将为您希望让用户能够设置的属性定义输入。您还可以定义输出,以便配置信息可以在数据总线上发布。本例有一个名为“AlterationType”的输入,并使用枚举“AlterationMethod”。通过指定一个枚举,您将自动获取一个弹出式选择框,以便从枚举中的可用选项中进行选择。

重要说明: 始终需要为此类指定一个默认构造函数,否则将在设计器中收到异常。当该活动加载和显示属性页时,它将使用默认构造函数初始化此类。

另外,您可以指定多个 ActivityData 类以获得多个配置类型,并在您的 IP 中的每个活动中使用所需的任一类型。

现在,我们已经定义了一个配置类,下面需要将其添加到要使用它的活动中。将其添加到该活动中非常简单,如下所示:

[ActivityConfiguration]
public HelloWorldConfiguration Settings
{
    set
    {
        _settings = value;
    }
}
protected HelloWorldConfiguration _settings;

当此活动加载时,它将发现 ActivityConfiguration 属性,并初始化 HelloWorldConfiguration 类。然后,如果用户在配置中选择了该选项设置,该数据在设计时和运行时将在“Settings”属性中可用。

下面是一个在运行时使用该值修改活动行为的示例。当用户选择“Reverse”、“Scramble”或“None”中的一个值时,将更改 ActivityOutput 的处理方式:

[ActivityOutput("Hello World Output")]
public string HWOutput
{
    get
    {
        if (_settings.AlterationType == AlterationMethod.Reverse)
        {
            char[] arr = hwinput.ToCharArray();
            Array.Reverse(arr);
            return new string(arr);
        }
        else if (_settings.AlterationType == AlterationMethod.Scramble)
        {
            return ScrambleString(hwinput);
        }
        return hwinput;
    }
}

在上面的代码中,您可以看到,当用户选择“Reverse”时,他们将获取该活动的原始行为,此选项用于反转该字符串。当他们选择“Scramble”时,它将创建分支,运行另一方法来打乱该字符串。如果他们选择“None”,则对字符串不执行任何操作,它将返回原始值。下面是 ScrambleString 方法代码:

    private string ScrambleString(string input)
    {
        char[] arr = new char[input.Length];
        Random rand = new Random(10000);
        int index = 0;

        while (input.Length > 0)
        {
            int next = rand.Next(0, input.Length - 1);
            arr[index] = input[next];
            input = input.Substring(0, next) + input.Substring(next + 1);
            ++index;
        }
        return new String(arr);
    }
}

在编译此代码时,您现在可以使用此配置,方法是(在 Runbook Designer 中)选择“选项”>“调用 .NET”,然后单击“添加”并选择“程序集”和“类”。

您可以看到这里有一个名为“AlterationType”的选项。此外,如果我需要一个比实际属性名更友好的名称,我只需在 ActivityInput 属性中指定该名称,这与任何其他输入属性完全相同。我可以使用此类型定义多个配置,如下所示:

然后,可以在 Invoke .NET 活动中使用这些配置设置,如下所示:

而且,当单击“安装”旁边的按钮时,将获取一个选项列表:

现在,如果在此活动中输入一个字符串并使用 Runbook 测试器,将获取不同的结果,具体取决于在 Setup 属性中的选择。显然,您可以让您的配置更丰富一些并添加许多不同的属性,甚至可以添加实时查询来填充选项框,等等。配置有许多潜在用途。在大多数情况下,对于每个 IP 我们仅使用一个配置类型,但也可以使用多个配置类型 – IP 的一部分使用 PowerShell 远程处理,另一部分使用 WMI。您可能需要为其中每一项分离配置设置,并且只有特定的类型会在不同活动中提供。还可以将该配置设置用作一种方式,以基于用户的选择改变整个输入或输出属性集。下一篇文章将更详细地介绍此内容!