尽管 BizTalk Server 提供了许多 functoid 来支持各种操作,但您可能会遇到需要采用不同方法的情况。 自定义 functoid 提供了一种方法,可以扩展 BizTalk Server 映射环境中可用的操作范围。 每个自定义 functoid 都作为 .NET 程序集部署,其中使用从 Microsoft.BizTalk.BaseFunctoids 派生的类。 程序集可以包含多个自定义功能体。
在以下情形中,应考虑使用自定义功能节点:
为字符代码字段制定特殊的验证和转换规则,这些规则使用只能通过专有的旧版 API 访问的数据。
需要使用自定义业务逻辑和密钥管理来加密或解密字段。
需要从消息的一部分生成哈希代码,以便在另一个应用程序中使用。
会计部门要求传输到其部门的消息包括关于每种产品类型的总销售额的摘要信息。
你希望通过组合多个相关步骤、使用不同的方法或使用新的类库来减少地图的复杂性。
多个地图在脚本功能模块中使用相同的脚本代码。
当一个操作失败时,你需要写入事件日志。
自定义 functoid 可以通过两种方式集成到解决方案中:直接使用内联代码,或通过引用部署到全局程序集缓存中的类库中的方法间接集成。 这两种类型的集成都依赖于 BizTalk.BaseFunctoid 类,并遵循相同的一组常规步骤:
使用所选的 .NET 语言创建新的类库项目。
使用强命名实用工具 sn.exe创建密钥文件并将其分配给项目。
添加对 Microsoft.BizTalk.BaseFunctoids.dll的引用。 此程序集包含 BaseFunctoid 基类。
创建资源文件并将其添加到项目。 为 functoid 名称、工具提示和说明添加字符串资源。 添加 16x16 像素图像资源以表示地图设计器调色板上的功能体。
通过派生自 BaseFunctoid、在构造函数中建立基本参数,然后编写 functoid 方法和任何支持方法来实现 functoid 类。 程序集可以包含多个自定义功能点。
部署程序集并确保工具箱面板中提供了新的功能块。 请参阅 在 Visual Studio 工具箱中添加和移除自定义 Functoids。
下面是 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# 项目的一部分时,必须将“程序集名称”设置为“MultipleFunctoid”。 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 被标准/内置的 Mapper 功能块保留。 通常,标准的 Mapper 功能对象使用从 1 到 10000 的 ID。 创建自定义 functoid 时,请勿使用小于 10000 的 functoid ID。
本节中
本部分包含: