向自定义活动添加选项菜单配置
昨天,我写了有关如何使用 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。您可能需要为其中每一项分离配置设置,并且只有特定的类型会在不同活动中提供。还可以将该配置设置用作一种方式,以基于用户的选择改变整个输入或输出属性集。下一篇文章将更详细地介绍此内容!