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. ui-bootstrap-tpls-0.11.0.min.js

  2. js实现元素添加样式

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 解决SimpleCursorAdapter不能自动更新的问题

    假设场景是这样的:你使用SimpleCursorAdapter显示数据,并监听数据的变化:在数据发生变化的时候,调用cursor的requery,期待UI显示也跟着变化. 但是,你可能会发现,UI并没 ...

  4. JavaScript 阶段总结

  5. 创建数据库时报"FILESTREAM 功能被禁用"

    问题,创建含有FileStream数据库时报"FILESTREAM 功能被禁用" 解决方式 修改数据库属性 打开管理配置工具,右键打开sql server的属性,查看FILESTR ...

  6. my Style

    1. box-sizing语法: box-sizing : content-box || border-box || inherit 参数取值: content-box:此值为其默认值,其让元素维持W ...

  7. JavaScript BOM 遗漏知识再整理;弹窗和记时事件;

    1.JavaScript 弹窗 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. window.alert() 方法可以不带上window对象, ...

  8. 兼容FF 加入收藏夹和设为首页

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. js里的原型

    <script type="text/javascript"> function People(name){ this.name = name; //对象方法 this ...

  10. javascript往textarea追加内容

    <html> <body> <textarea id="content"></textarea> <script> va ...