开发自定义 Functoid
尽管 BizTalk Server 提供许多 functoid 以支持一系列不同的操作,您可能仍会遇到需要其他方法的情况。 自定义 functoid 提供的方法可扩展 BizTalk Server 映射环境中可用操作的范围。 每个自定义 functoid 都使用派生自 Microsoft.BizTalk.BaseFunctoids 的类部署为 .NET 程序集。 一个程序集可包含多个自定义 functoid。
在以下情况下可以考虑使用自定义 functoid:
您对使用只能通过专用旧式 API 访问的数据的字符代码字段应用特殊的验证和转换规则。
您需要使用自定义业务逻辑和密钥管理来加密或解密字段。
您需要从部分消息生成哈希代码以用于其他应用程序。
财务要求传输到他们部门的消息包含有关每种产品类型销售总额的摘要信息。
您希望通过合并一些相关步骤、使用其他方法或使用新的类库来降低映射的复杂性。
多个映射在脚本 functoid 中使用相同的脚本代码。
您需要将操作失败写入事件日志。
使用内联代码可直接将自定义 functoid 集成到解决方案中,也可以通过引用部署在全局程序集缓存中的类库的方法来间接集成。 这两种类型的集成都依赖于 BizTalk.BaseFunctoid 类,并遵循相同的一组常规步骤:
使用您选择的 .NET 语言创建新的类库项目。
使用强名称实用程序 sn.exe 创建密钥文件并将其指定给项目。
添加对 Microsoft.BizTalk.BaseFunctoids.dll 的引用。 此程序集包含 BaseFunctoid 基类。
创建资源文件并将其添加到项目中。 为 functoid 名称、工具提示和说明添加字符串资源。 添加一个 16x16 像素的图像资源,在映射设计器面板上代表该 functoid。
通过从 BaseFunctoid 派生,在构造函数中建立基本参数,然后编写 functoid 方法和任何支持方法来实现 functoid 类。 该程序集可包含多个自定义 functoid。
部署该程序集并确保可从工具箱面板访问新 functoid。 请参阅 从 Visual Studio 工具箱中添加和删除自定义 Functoid。
以下是 Floor functoid 的说明。
/// <summary>
/// Floor Functoid - finds the floor of input
/// </summary>
public class FloorFunctoid : BaseFunctoid
{
public FloorFunctoid()
: base()
{
this.ID = 11001;
SetupResourceAssembly("MultipleFunctoids.Resource", Assembly.GetExecutingAssembly());
SetName("NAME_FLOOR");
SetDescription("DESCRIPTION_FLOOR");
SetTooltip("DESCRIPTION_FLOOR");
SetBitmap("IMAGE_FLOOR");
SetExternalFunctionName(GetType().Assembly.FullName, " MultipleFunctoids.FloorFunctoid", "MathFloor");
this.RequiredGlobalHelperFunctions = InlineGlobalHelperFunction.IsNumeric;
AddScriptTypeSupport(ScriptType.CSharp);
SetMinParams(1);
SetMaxParams(1);
this.Category = FunctoidCategory.Math;
this.OutputConnectionType = ConnectionType.AllExceptRecord;
AddInputConnectionType(ConnectionType.AllExceptRecord);
this.HasSideEffects = false;
}
/// <summary>
/// To create the C# function
/// </summary>
/// <param name="scriptType">Script type</param>
/// <param name="numParams">Number of parameters</param>
/// <param name="functionNumber">Functoid number</param>
/// <returns>C# script</returns>
protected override string GetInlineScriptBuffer(ScriptType scriptType, int numParams, int functionNumber)
{
if (ScriptType.CSharp == scriptType)
{
StringBuilder builder = new StringBuilder();
builder.Append("public string MathFloor(string input)\n");
builder.Append("{\n");
builder.Append(" if(string.IsNullOrEmpty(input))\n");
builder.Append(" return string.Empty;\n");
builder.Append("double d = 0.0;\n");
builder.Append("if (IsNumeric(input, ref d))\n");
builder.Append(" return Math.Floor(d).ToString(System.Globalization.CultureInfo.InvariantCulture);\n");
builder.Append("else\n");
builder.Append(" return string.Empty;\n");
builder.Append("}\n");
return builder.ToString();
}
else
{
return string.Empty;
}
}
}
将此示例代码用作 C# 项目的一部分时,“程序集名称”必须设置为“MultipleFunctoids”。 C# 项目(包含此代码)应包含 Resource.resx 文件。
SetName("NAME_FLOOR");
SetDescription("DESCRIPTION_FLOOR");
SetTooltip("DESCRIPTION_FLOOR");
SetBitmap("IMAGE_FLOOR");
在上述代码中,值“NAME_FLOOR”、“DESCRIPTION_FLOOR”和“DESCRIPTION_FLOOR”是嵌入 Resource.resx 文件中的资源字符串的“键”。 另外,“IMAGE_FLOOR”是嵌入 Resource.resx 文件中的图像名称。 此图像用作 functoid 的图标。
如果您未指定正确的资源键或删除了 SetName 方法,那么将创建一个没有名称的自定义 functoid,这并不是一种好的做法。 对于 SetDescription 和 SetTooltip 方法也是如此。 请始终正确使用这些方法,以避免任何不需要的垃圾行为。 但是,如果没有任何合适的图像用作 functoid 图标,则可以跳过 SetBitmap 方法。 在这种情况下,自定义 functoid 使用默认图标,这是无害的 (除非有多个无图标 functoid) 。
有关如何创建自定义 functoid 的详细信息,请参阅自定义 functoid (BizTalk Server 示例) 。
重要
某些 functoid ID 已由标准/内置映射器 functoid 保留。 通常,标准 Mapper functoid 使用 1 到 10000 的 ID。 创建自定义 functoid 时,请勿使用小于 10000 的 functoid ID。
本节内容
本部分包含: