尽管 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. JQ学习(三)-ajax

    jQuery - AJAX jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法 ...

  2. Uva10328 dp(递推+高精度)

    题目链接:http://vjudge.net/contest/136499#problem/F 题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种. 一个比较好理解的题解:原题中问 ...

  3. Swift3.0语言教程获取字符串编码与哈希地址

    Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...

  4. 分享Kali Linux 2016.2第41周镜像虚拟机

    分享Kali Linux 2016.2第41周镜像虚拟机该虚拟机使用Kali Linux 2016.2第41周镜像文件安装而成,系统已经更新到10月12日.里面已经进行如下配置:(1)设置官方软件源( ...

  5. [工作中的设计模式]适配器模式adapter

    一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...

  6. fzu月赛 2203 单纵大法好 二分

    Accept: 8    Submit: 18Time Limit: 5000 mSec    Memory Limit : 65536 KB  Problem Description 人在做,天在看 ...

  7. Thymeleaf模板引擎使用

    Thymeleaf模板引擎使用 什么是Thymeleaf Thymeleaf是一个Java库.它是一个XML / XHTML / HTML5模板引擎,能够在模板文件上应用一组转换,将程序产生的数据或者 ...

  8. enum枚举类型的使用

    修饰符为public static enum,不用加final,否则提示错误. 枚举类的所有实例必须在枚举类中显式列出(,分隔,; 结尾).列出的实例系统会自动添加 public static fin ...

  9. Mac OS Storm+Kafka+Zookeeper配置

    先补充一个前两天mac配置的文档. 首先确定由jdk scala环境 JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/Cu ...

  10. BZOJ4107 : [Wf2015]Asteroids

    首先将速度相减,变成A在动而B不动,若速度为0则显然永远不会相交. 枚举A的每个点以及B的每条线段,计算这三个点共线的时刻. 将时刻排序,对于每个区间进行三分,用半平面交计算相交面积. 注意特判相交面 ...