尽管 BizTalk Server 提供许多Functoid以支持一系列不同的操作,但仍可能会遇到需要其他方法的情况。《BizTalk开发系列 Map扩展开发》介绍了通过使用自定义 XSLT,脚本 Functoid等方法来扩展。这里要介绍的是通过自定义 functoid 的方法扩展。

 每个自定义Functoid为从Microsoft.BizTalk.BaseFunctoids派生的类的 .NET 程序集。一个程序集可包含多个自定义 functoid。下图的Format Date功能块是自定义开发的Functoid,功能是将输入参数1的字符串按参数2的格式输出。部署之后添加到工具箱。

微软提供了相关使用自定义Functoid的场景:

  • 您对使用只能通过专用旧式 API 访问的数据的字符代码字段应用特殊的验证和转换规则。
  • 您需要使用自定义业务逻辑和密钥管理来加密或解密字段。
  • 您需要从部分消息生成哈希代码以用于其他应用程序。
  • 财务要求传输到他们部门的消息包含有关每种产品类型销售总额的摘要信息。
  • 您希望通过合并一些相关步骤、使用其他方法或使用新的类库来降低映射的复杂性。
  • 多个映射在脚本 functoid 中使用相同的脚本代码。
  • 您需要将操作失败写入事件日志。

    开发自定义Functoid有以下几个类别:

    • 自定义引用 Functoid

    自定义引用的 Functoid 不会将内联的实现代码复制到映射中。实际上,它将对程序集、类和方法的引用放置在与生成的样式表相关联的扩展对象文件中,并在运行时对其进行调用。

  • 自定义内联 Functoid

自定义内联 functoid 通过将实现代码直接复制到映射中提供功能,而不像自定义引用的 functoid 通过引用程序集、类和方法名称来提供功能。

  • 自定义累计 Functoid

自定义累计 functoid 可以对在一个实例消息中多次出现的值执行累计操作。

使用内联代码可直接将自定义 functoid 集成到解决方案中,也可以通过引用部署在全局程序集缓存中的类库的方法来间接集成。这两种类型的集成都依赖于 BizTalk.BaseFunctoid 类并遵循同样一组通用步骤:

  1. 使用您选择的 .NET 语言创建新的类库项目。
  2. 使用强名称实用程序 sn.exe 创建密钥文件并将其指定给项目。
  3. 添加对 Microsoft.BizTalk.BaseFunctoids.dll 的引用。此程序集包含 BaseFunctoid 基类。
  4. 创建资源文件并将其添加到项目中。为 functoid 名称、工具提示和说明添加字符串资源。添加一个 16x16 像素的图像资源,在映射设计器面板上代表该 functoid。
  5. 实现 functoid 类,方法是从 BaseFunctoid 派生该类,在构造函数中建立基本参数,然后编写 functoid 方法和所有支持方法。该程序集可包含多个自定义 functoid。
  6. 部署该程序集并确保可从工具箱面板访问新 functoid。

 Format Date Functoid代码


using System;

using Microsoft.BizTalk.BaseFunctoids;

using System.Reflection;

using System.Text;

using System.Collections;

using System.Globalization; 

namespace Quicklearn.CN.BTS.CustomerFunctoids

{

    public class FormatDate : BaseFunctoid

    {

        public FormatDate()

            : base()

        {

            //Functoid的ID号.尚未用过的大于6000的值.

            this.ID = 88888; 

            //资源文件

            SetupResourceAssembly("Quicklearn.CN.BTS.CustomerFunctoids.Resource", Assembly.GetExecutingAssembly()); 

            //Functoid的名称,描述,说明,图像

            SetName("QUICKLEARN_CN_FORMATDATE_NAME");

            SetTooltip("QUICKLEARN_CN_FORMATDATE_TOOLTIP");

            SetDescription("QUICKLEARN_CN_FORMATDATE_DESCRIPTION");

            SetBitmap("QUICKLEARN_CN_FORMATDATE_BITMAP"); 

            //this.HasVariableInputs = true; //参数个数是否不确定

            this.SetMinParams(2);//最小参数

            this.SetMaxParams(2);//最大参数 

            SetExternalFunctionName(GetType().Assembly.FullName, "Quicklearn.CN.BTS.CustomerFunctoids.Resource", "Format"); 

            this.Category = FunctoidCategory.String; //分类

            this.OutputConnectionType = ConnectionType.All;//输出类型 

            //设置支持的脚本格式(内联型Functoid需要设置此项).

            AddScriptTypeSupport(ScriptType.CSharp); 

            //内联型的脚本,代码将会被拷贝到XSLT文件中.方便调试.

            SetScriptBuffer(ScriptType.CSharp, InitFormat(), 0); 

            AddInputConnectionType(ConnectionType.All); //第一个参数类型

            AddInputConnectionType(ConnectionType.All); //第二个参数类型 

        }

        public string Format(string paramDate,string paramExpress)

        {

            string responseDate = paramDate;

            try

            {

                DateTime strDate = Convert.ToDateTime(paramDate);

                responseDate = strDate.ToString(paramExpress);

            }

            catch { }

            return responseDate;

        }

        //将方法代码映射到XSLT。

        private string InitFormat()

        {

            StringBuilder builder = new StringBuilder(); 

            builder.Append("public string Format(string paramDate,string paramExpress)\n");

            builder.Append("{\n");

            builder.Append("    string responseDate = paramDate;\n");

            builder.Append("    try\n");

            builder.Append("{\n");

            builder.Append("    DateTime strDate = Convert.ToDateTime(paramDate);\n");

            builder.Append("    responseDate = strDate.ToString(paramExpress);\n");
            builder.Append("}\n");
            builder.Append("catch { }\n");
            builder.Append("return responseDate;\n");
            builder.Append("}\n"); 

            return builder.ToString(); 

        } 

    }
} 

测试

 自定义Functoid
的测试工作非常不方便,简化该过程可以先使用自定义内联脚本或外部程序集的方式先将程序调整完好。另外对于内联Functoid可以将Map生成XSLT
进行详细调试。以下是通过验证Map生成的XSLT内容,内联型的Functoid已经将方法代码拷贝到XSLT中。

BizTalk开发系列(二十二) 开发自定义Map Functoid的更多相关文章

  1. 【Qt程序】基于Qt词典开发系列<十二>呼叫讲述

    我们知道,win7系统自带有讲述人,即能够机器读出当前内容,详细能够将电脑锁定.然后点击左下角的button就可以.之前在用Matlab写扫雷游戏的时候,也以前调用过讲述人来进行游戏的语音提示. 详细 ...

  2. BizTalk开发系列(三十二)浅谈BizTalk主机性能优化

    很多BizTalk的项目都要考虑到性能优化的问题,虽然BizTalk采用多线程处理消息的,大大提高了程序效率.但默认情况下 BizTalk的主机有很多阻止参数会控制BizTalk对服务器的资源使用率, ...

  3. BizTalk 开发系列(四十二) 为BizTalk应用程序打包不同的环境Binding

    我们在使用微软或者其他公司提供的BizTalk应用程序MSI包的时候经常会有一个目标环境的选择选项.该选项可以在不同的环境下使用不同的绑定(BizTalk应用程序配置)感觉很高级. 其实这个非常的简单 ...

  4. Chrome浏览器扩展开发系列之十二:Content Scripts

    Content Scripts是运行在Web页面的上下文的JavaScript文件.通过标准的DOM,Content Scripts 可以操作(读取并修改)浏览器当前访问的Web页面的内容. Cont ...

  5. Android商城开发系列(十二)—— 首页推荐布局实现

    首页新品推荐的布局效果如下图: 这块布局是使用LinearLayout和GridView去实现,新建recommend_item.xml,代码如下所示: <?xml version=" ...

  6. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

    紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...

  8. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  9. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  10. Senparc.Weixin.MP SDK 微信公众平台开发教程(二十二):如何安装 Nuget(dll) 后使用项目源代码调试

    最近碰到开发者问:我使用 nuget 安装了 Senparc.Weixin SDK,但是有一些已经封装好的过程想要调试,我又不想直接附加源代码项目,这样就没有办法同步更新了,我应该怎么办? 这其实是一 ...

随机推荐

  1. C#开发微信公众平台-就这么简单(附Demo)(转)

    原文:http://www.cnblogs.com/xishuai/p/3625859.html 写在前面 阅读目录: 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文. ...

  2. Linux将文件拷到u盘

    1:终端中获取root后,使用fdisk -l来查看位置 2:挂载u盘:mount /路径 /mnt cd /mnt可进入u盘,ls可查看文件 3:复制:cp /(文件路径) /mnt 4:退出u盘: ...

  3. Spring事务解析2-标签解析

    根据自定义标签的使用规则,可以知道会执行AnnotationDrivenBeanDefinitionParser的parse @Override public BeanDefinition parse ...

  4. HTML5 重要标签及其属性学习

    1.google字体:<link href="https://fonts.googleapis.com/css?family=Lobster" rel="style ...

  5. Linux 环境中普通用户启动Myeclipse出错

    将Myeclipse安装在/usr/local/myeclipse目录中,由root用户启动时没有问题,而用普通用户时出现如下故障: The configuration area at '/usr/l ...

  6. Mac 自带 apache

    1.启动服务器 sudo apachectl start http://localhost   能访问就ok sudo apachectl stop sudo apachectl restart ht ...

  7. [转]shell 变量替换

    转自:http://blog.csdn.net/xuhongning/article/details/6191515 1,参数替换: 不含有“:”的,只要定义了,就生效,不管是否为空 含有“:”的,即 ...

  8. JavaScript 开发者经常忽略或误用的七个基础知识点

    JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...

  9. sublime注释插件与javascript注释规范

    前言 代码中注释是不可少的,即使是自己写的代码,过了一段时间之后再重看,如果没有注释记录的话,可能会想不到当初是这样实现的,尤其是在业务逻辑比较复杂的项目,注释变得尤为重要.怎么优雅的写有用的注释呢? ...

  10. HTTP协议---HTTP请求中的常用请求字段和HTTP的响应状态码及响应头

    http://blog.csdn.net/qxs965266509/article/details/8082810 用于HTTP请求中的常用请求头字段 Accept:用于高速服务器,客户机支持的数据类 ...