尽管 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. td 的colspan属性

    看来要长长记性了,这个问题上次遇到过这次又犯了这个错. <table> <tr> <td colspan="10"> </td> & ...

  2. AngularJS开发之_指令

    指令是什么?    指令是我们用来扩展浏览器能力的技术之一.在DOM编译期间,和HTML关联着的指令会被检测到,并且被执行.这使得指令可以为DOM指定行为,或者改变它. 1.指令的匹配模式 index ...

  3. 编解码-java序列化

    大多数Java程序员接触到的第一种序列化或者编解码技术就是Java的默认序列化,只需要序列化的POJO对象实现java.io.Serializable接口,根据实际情况生成序列ID,这个类就能够通过j ...

  4. css3 总结01

    前缀 chrome: -webkit- safari: -webkit- firefox: -moz- ie: -ms- opera: -o- 书写的时候应该先用有前缀的样式,再用无前缀的样式 颜色 ...

  5. Swift3.0语言教程比较、判断字符串

    Swift3.0语言教程比较.判断字符串 Swift3.0语言教程比较.判断字符串,在一个程序中字符串很多时,常常会做的操作就是对这些字符串进行比较和判断.本小节将讲解这些内容. 1.不区分大小写比较 ...

  6. [xsd学习]xsd实例

    以下为一个表示学校的xml文件,学校内有若干学生,每个学生都有基本信息,电脑信息,选课信息 <?xml version="1.0" encoding="UTF-8& ...

  7. Chage

    For many times,i've given my own a new lifestyle,such as don't stay up late,have breakfast......whil ...

  8. jQuery WipeTouch

    有时,当你只想为触屏划动添加事件时,很多人可能会想到,Jquery mobile,但就这么个功能就把人家这么高大上的东西引用进来就有点大才小用了,WipeTouch是国外某程序员写的针对触屏划动的jq ...

  9. Java线程并发控制基础知识

    微博上众神推荐今年4月刚刚出版的一本书,淘宝华黎撰写的<大型网站系统与Java中间件实践>,一线工程师的作品,实践出真知,果断要看. 前两章与<淘宝技术这十年>内容类似,基本是 ...

  10. java获取日期

    /* * 获取昨天日期 方法一,这个方法好像有点慢 */Date dt = new Date(); Calendar cal = Calendar.getInstance();cal.add(Cale ...