http://www.cnblogs.com/StoneGarden/archive/2012/02/02/2336147.html

MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)

MS CRM 2011的自定义和开发(8)——扩展框架以及扩展点介绍中介绍了扩展点,在MS CRM 2011的自定义开发(10)的几篇文章中介绍了Microsof Dynamics CRM 2011中的发现服务DiscoveryService以及组织服务OrganizationService,从而完成了开发方面基础知识的准备工作,在本章,以及后续的几章将会介绍如何利用这些服务,在扩展点上进行扩展开发。本章介绍插件开发内容。

插件,Plugin,在之前的版本也被称作Callout,中文也可以称作是业务逻辑扩展。在SDK中,对插件的定义是:插件是可与 Microsoft Dynamics CRM 2011 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为。也可以将插件认为是针对 Microsoft Dynamics CRM 平台触发的事件的处理程序。您可以让插件订阅(也称为注册)已知事件集,以便在事件发生时运行您的代码。

个人的理解,插件,可以和数据库中的触发器,面向对象编程中的事件处理函数进行类比。触发器,可以由对数据表进行Update、Insert或Delete的操作触发,从而开始执行。事件处理函数,基于消息而执行。而插件,会根据注册时订阅的消息而触发执行。而且,可以被订阅的消息非常之多,除了CRUD操作,还包括有其他分派、共享等等MS CRM系统中具有业务语义的消息。此外,插件也可以有类似于触发器中Before、After等处理阶段的概念,被称为事件管道阶段。

在介绍插件开发之前,首先要了解微软CRM的事件处理框架。

MS CRM的事件处理框架包括以下一些内容:

事件处理子系统:该子系统提供执行插件、工作流的统一的方法,从而保障了可靠性、功能集以及灵活性;

事件框架API:允许以插件、工作流活动的形式开发自定义业务逻辑,从而扩展系统的功能;

部署API:完成插件以及自定义工作流活动程序集的部署操作,尤其是可以将插件、工作流程序集部署到CRM的数据库中,在集群环境下非常有意义,避免了服务器之间的文件拷贝工作;

向后兼容性:允许V4版本的插件运行于CRM2011中;

同步/异步:可以作为主CRM流程的一个组成部分被执行,也可以放入异步队列,被异步执行;

Microsoft Dynamics CRM 事件处理子系统根据消息管道执行模型执行插件。MS CRM Web应用程序中的用户操作或者插件或其他应用程序执行的 SDK 方法调用会导致将消息发送到组织服务。被传递给组织服务的消息包含业务实体信息和核心操作信息,该消息是通过事件执行管道传递的,平台核心操作和任何注册的插件都可以在事件执行管道中读取或修改它。

事件处理体系架构如下图所示。

事件执行管道可以使用同步或者异步两种方式处理事件。平台核心操作以及注册为同步执行的插件会立即执行,而对于注册为异步执行的插件,CRM系统会把事件处理放入到异步队列中,而后,由MS CRM的异步处理服务进行管理控制。

事件管道阶段,事件执行管道分为多个阶段,以平台核心操作作为分界,在平台核心操作之前执行的阶段被称为前置事件(前期事件、Pre-Event),在平台核心操作之后执行的阶段被成为后置事件(后期事件、Post-Event)。下表是事件管道阶段的详细信息:

事件

阶段名称

阶段编号

说明

前期事件

前期验证

10

管道中的一个阶段,其中的插件在主系统操作之前执行。在此阶段注册的插件可能会在数据库事务外部执行。

前期事件

前期操作

20

管道中的一个阶段,其中的插件在主系统操作之前执行。在此阶段注册的插件将在数据库事务内部执行。

平台核心操作

主操作

30

系统的事务内主操作,例如创建、更新和删除等等。在该阶段中不可以注册自定义插件。仅供内部使用。

后期事件

后期操作

40

管道中的一个阶段,其中的插件在主系统操作之后执行。在此阶段注册的插件将在数据库事务内部执行。

后期事件

后期操作(已弃用)

50

管道中的一个阶段,其中的插件在主系统操作之后执行。在此阶段注册的插件可能会在数据库事务外部执行。此阶段仅支持基于 Microsoft Dynamics CRM 4.0 的插件。

由于可以在一个阶段注册多个插件,换言之,多个插件可以订阅一个事件,那么在实际运行中,当调用了CRM组织服务的方法时,作为参数传递给方法的消息会被打包为OrganizationRequest消息,并交由管道进行处理。管道会将消息传递给订阅了该事件的第一个插件,第一个插件执行过程中,会对消息进行读取、修改等操作,该插件执行完成后,被处理后的消息将会继续在管道中执行——被管道传递给下一个插件,以此类推。

在MS CRM 2011中,新增加的一个特性就是,在编号20至编号40三个阶段是处于数据库事务中的,从而在一定程度上保证了数据操作的完整性。假设插件处于阶段20或者阶段40,如果插件抛出了异常,那么将会回滚整个事务。

MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)的更多相关文章

  1. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  2. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/08/2343294.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  3. MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)

    http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...

  4. 【Mybtais】Mybatis 插件 Plugin开发(一)动态代理步步解析

    需求: 对原有系统中的方法进行'拦截',在方法执行的前后添加新的处理逻辑. 分析: 不是办法的办法就是,对原有的每个方法进行修改,添加上新的逻辑:如果需要拦截的方法比较少,选择此方法到是会节省成本.但 ...

  5. Android组件化和插件化开发

    http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...

  6. YYDS: Webpack Plugin开发

    目录 导读 一.cdn常规使用 二.开发一个webpack plugin 三.cdn优化插件实现 1.创建一个具名 JavaScript 函数(使用ES6的class实现) 2.在它的原型上定义 ap ...

  7. CRM 2011 开发中遇到的问题小结

    1.将Retrive 方法改成 RetrieveMultiple时 如果指定的ColumnSet 没有指定主键(entiryname+id),要显示增加实体的主键.否则在调用 Retrieve方法时返 ...

  8. Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法(转)

    本篇文章,介绍Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法. RetreiveMultiple方法,用于获取实体的多个实例,该方法的签名如下 ...

  9. Microsoft Dynamics CRM 2011 安装完全教程

    作者:卞功鑫,转载请保留.http://www.cnblogs.com/BinBinGo/p/4302612.html 环境介绍 WINDOWS 2008 R2 Datacenter Microsof ...

随机推荐

  1. TypeError: The CanvasRenderingContext2D.webkitBackingStorePixelRatio getter can only be used on instances of CanvasRenderingContext2D

    ios10: CanvasRenderingContext2D.prototype.webkitBackingStorePixelRatio 报异常

  2. 在Fragment中获取Activity中数据

    今天要做一个功能,用Fragment显示从其所在的Acitivity1中获取到的数据.这个Activity1是从另一个带有参数Activity2跳转过来的,所以要获得的是这些参数.因为之前没遇到过,所 ...

  3. Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程

    1) jps    列出相关的java进程, 以及对应的pid    也可以使用如下命令来尝试    ps aux | grep java --color 2) top -Hp <pid> ...

  4. c#实现高精度四舍五入

    /// <summary>        /// 實現數據的四捨五入        /// </summary>        /// <param name=" ...

  5. 软件工程课程作业(三)--四则运算3(C++)

    伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思路 在此前程序拥有的功能:加减有无负数,除法有无余数以及算式可定制的功能的基础上,此次程序又添加了算式结果的 ...

  6. C++ Primer:第七章:类

    定义一个类: class Myclass{ int data_i; string data_str; public: int getdata_i() const { return data_i; } ...

  7. T语言TC发布脚本方法

    代码模式的注册码发布脚本方法 注册码项目模式的发布脚本方法 1.注册码项目发布版 2.注册码项目代理版 这两种方法都是基于注册码项目来实现的,所以在使用之前,需要先创建注册码项目.

  8. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  9. UVa 489 HangmanJudge --- 水题

    UVa 489 题目大意:计算机给定一个单词让你猜,你猜一个字母,若单词中存在你猜测的字母,则会显示出来,否则算出错, 你最多只能出错7次(第6次错还能继续猜,第7次错就算你失败),另注意猜一个已经猜 ...

  10. Javascript高性能动画与页面渲染

    转自:http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering No setT ...