尽管 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. ASP.Net MVC开发基础学习笔记(4):校验、AJAX与过滤器

    一.校验 — 表单不是你想提想提就能提 1.1 DataAnnotations(数据注解) 位于 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据 ...

  2. DSP using MATLAB 示例Example3.4

    代码: n = [-1:3]; x = [1:5]; % x(n) = {1,2,3,4,5} % * % k = 0:500; w = (pi/500)*k; % [0,pi] axis divid ...

  3. spring 架构学习

    学习目的用于抽象业务逻辑,因spring本身就是抽象业务逻辑的框架,如做业务架构网面的工作 spring为不二之选. 一些好的网址 http://www.ibm.com/developerworks/ ...

  4. Robotium ant 报错Unable to find instrumentation info for: ComponentInfo{project/android.test.InstrumentationTestRunner}

    [echo] Running tests ... [exec] INSTRUMENTATION_STATUS: id=ActivityManagerService [exec] INSTRUMENTA ...

  5. Codeforces 617E XOR and Favorite Number(莫队算法)

    题目大概说给一个序列,多次询问区间异或和为k的连续子序列有多少个. 莫队算法,利用异或的性质,通过前缀和求区间和,先处理出序列各个前缀和,然后每次区间转移时维护i以及i-1前缀和为某数的个数并增加或减 ...

  6. Shell 编程基础之 Case 练习

    一.语法 case $变量 in "第一个变量内容") # 每个变量内容建议用双引号括起来,关键字则为小括号 ) # 执行内容 ;; # 每个类别结尾使用两个连续的分号来处理! & ...

  7. Codeforces Round #363 Div.2[111110]

    好久没做手生了,不然前四道都是能A的,当然,正常发挥也是菜. A:Launch of Collider 题意:20万个点排在一条直线上,其坐标均为偶数.从某一时刻开始向左或向右运动,速度为每秒1个单位 ...

  8. 纯CSS打造银色MacBook Air(完整版)

    上一篇:<selection伪元素小解> ::selection{ background:blue; color:red; }p{font-size:14px;} 作者主页:myvin 博 ...

  9. Codeforces Testing Round #10 B. Balancer

    水题,只要遍历一遍,不够平均数的,从后面的借,比平均数多的,把多余的数添加到后面即可,注意数据范围 #include <iostream> #include <vector> ...

  10. Flex弹性布局在移动设备上的应用

    引文 首先,我们有表格布局.当不考虑语义并且利用一些适当的嵌套和其他技巧,我们可以用table建立具有一定功能的布局. 然后是现在大多数人都在使用的浮动布局.我们可以使用任何我们想用的元素,但浮动并不 ...