尽管 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. css 让内容满屏居中不变形

    .selector { position: fixed; width: 100%; height: 100%; background-image: url(path); background-repe ...

  2. AngularJS学习之模型

    1.ng-model指令:可以将输入域的值与AngularJS创建的变量绑定,用于绑定应用程序数据到HTML控制器(input,select,textarea)的值: <div ng-app=& ...

  3. css3 -- 伪类与伪元素

    伪类: 1.结构伪类 A:E : first-child{} E : nth-*(n){} E : first-*(even){}  E : first-*(odd){} B:nth-child 是根 ...

  4. input的placeholder文字颜色修改

    input::-webkit-input-placeholder { color: #D6D0CA !important; /* WebKit browsers / } input:-moz-plac ...

  5. 使用Spring发送邮件

    http://www.oschina.net/code/snippet_253813_36503

  6. 点击 Run 之后发生了什么?

    这是我以前去链家网面试的一个题目,当时回答不够全面,现在看了2016 WWDC以及Sunnyxx iDev大会的分享之后,感觉对这个问题有了一些简单的认识,就来总结下.如果大家有补充,麻烦评论下哦! ...

  7. js 数组(Array)

    一.数组 稠密数组(非稀疏数组) 稀疏数组 二.数组的添加和删除 我们已经常见过添加数组元素最简单的方法:为新索引赋值;也可以使用push()方法在数组末尾增加一个或者多个元素: a = []; a. ...

  8. Codeforces 581F Zublicanes and Mumocrates(树形DP)

    题目大概说有一棵树要给结点染色0或1,要求所有度为1的结点一半是0一半是1,然后问怎么染色,使两端点颜色不一样的边最少. dp[0/1][u][x]表示以u结点为根的子树中u结点是0/1色 且其子树有 ...

  9. BZOJ2080 : [Poi2010]Railway

    如果存在$k$使得$i<j<k$,且$a[k]<a[i]<a[j]$,那么$i$和$j$不能在一个栈中. 设$b[i]=\min(a[i..n])$,如果$b[j]<a[ ...

  10. Storm可靠性实例解析——ack机制

    对于Storm,它有一个很重要的特性:“Guarantee no data loss” ——可靠性 很显然,要做到这个特性,必须要track每个data的去向和结果.Storm是如何做到的呢——ack ...