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. Linked List Cycle II

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note ...

  2. 安装Python+Pywin32(version 3.3)

    1.下载python3.3,默认设置,安装. 2.完成后,在开始-程序中运行python IDLE.我在运行时出现了应用程序运行异常,原因是与其他软件内存发生冲突,如.net framework等. ...

  3. 222. Count Complete Tree Nodes

    Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...

  4. input type=file

    (1)首先来说一下,如何让 <input type='file' >成为你想要的模样. 最简单的方法就是在让<input type='file' >的透明度为0(完全透明),然 ...

  5. Spring MVC+Maven+Freemarker+Mybatis开发环境搭建

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 创建一个Spring MVC项目 集成Freemarker 集成Mybatis Mybatis自动生成工具   利用STS( ...

  6. JS初学之-if else图片顺序及循环切换

    初学JS,代码还需多多改进,自学中... <!doctype html><html><head><meta charset="utf-8" ...

  7. Makefile---make内嵌函数及make命令显示 (九)

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 这一节我们讲一下make的函数,在之前的章节已经讲到了几个函数:wildcard.patsubs ...

  8. C#部分---函数添加基本格式;

    格式1:没有参数,没有返回值 (无参无返) 添加函数: /// <summary> /// 累加求和的方法,没有参数,没有返回值 /// </summary> public v ...

  9. UVa 442 矩阵链乘(栈)

    Input Specification Input consists of two parts: a list of matrices and a list of expressions. The f ...

  10. hbase(ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException: Server is not running yet)

    今天启动clouder manager集群时候hbase list出现 (ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunningYetException ...