MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
Posted on 2013-10-22 07:53 ☆Keep★Moving☆ 阅读(299) 评论(0) 编辑 收藏 举报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,如果插件抛出了异常,那么将会回滚整个事务。