MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
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)开发(一)的更多相关文章
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(三)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2340661.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(四)
http://www.cnblogs.com/StoneGarden/archive/2012/02/08/2343294.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- MS CRM 2011的自定义和开发(11)——插件(plugin)开发(二)
http://www.cnblogs.com/StoneGarden/archive/2012/02/06/2339490.html MS CRM 2011的自定义和开发(11)——插件(plugin ...
- 【Mybtais】Mybatis 插件 Plugin开发(一)动态代理步步解析
需求: 对原有系统中的方法进行'拦截',在方法执行的前后添加新的处理逻辑. 分析: 不是办法的办法就是,对原有的每个方法进行修改,添加上新的逻辑:如果需要拦截的方法比较少,选择此方法到是会节省成本.但 ...
- Android组件化和插件化开发
http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...
- YYDS: Webpack Plugin开发
目录 导读 一.cdn常规使用 二.开发一个webpack plugin 三.cdn优化插件实现 1.创建一个具名 JavaScript 函数(使用ES6的class实现) 2.在它的原型上定义 ap ...
- CRM 2011 开发中遇到的问题小结
1.将Retrive 方法改成 RetrieveMultiple时 如果指定的ColumnSet 没有指定主键(entiryname+id),要显示增加实体的主键.否则在调用 Retrieve方法时返 ...
- Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法(转)
本篇文章,介绍Microsoft Dynamics CRM 2011的组织服务中的RetrieveMultiple方法. RetreiveMultiple方法,用于获取实体的多个实例,该方法的签名如下 ...
- Microsoft Dynamics CRM 2011 安装完全教程
作者:卞功鑫,转载请保留.http://www.cnblogs.com/BinBinGo/p/4302612.html 环境介绍 WINDOWS 2008 R2 Datacenter Microsof ...
随机推荐
- windows服务部署与卸载
同事问到windows service的东东,现在整理一下,用c#如何创建一个windows service,以及如何调试.部署.卸载. 一.创建windows service 1. 打开VS2008 ...
- Kali 找回root 密码的操作步骤
1. 重启kali 进入grub 界面,选择 “kali GNU/Linux, Linux 3.7-trunk-686-pae(恢复模式)” 2. 然后按下键盘E 键 3.进入编辑模式,找到Linux ...
- PE安装原版XP系统(含高版本PE安装选项灰色处理办法)
PE 安装 XP 镜像流程准备原版 XP 安装光盘镜像放到硬盘非 C 盘. 可解压到本地经行安装, 也可以使用虚拟光驱载入安装 (本教程主要讲 PE 内虚拟光驱载入安装) 第一步:用 U 盘或硬盘/光 ...
- hdu 4253 Two Famous Companies BZOJ 2654 tree
[题意]:给出n个点,m条边,边分为两种,一种是A公司的,一种是B公司的.边上有权值,问用n-1条边把n个点连起来的最小费用是多少,其中A公司的边刚好有k条.题目保证有解. 思路:我们发现,如果我们给 ...
- c# ICSharpCode.SharpZipLib.Zip实现文件的压缩
首先了解ZipOutPutStream和ZipEntry对象 ZipOutPutStream对象 如果要完成一个文件或文件夹的压缩,则要使用ZipOutputStream类.ZipOutputStre ...
- CSS3 transform的skew属性值图文详解
我刚刚接触transform的skew属性值时一头雾水,根本不知道种东西到底是咋变的.上网查,各个网站上也只说这个使用来做扭曲变换的,具体是咋变的就是不说....无奈我只好自己研究了,现把研究结果共享 ...
- Java获得文件的创建时间(精确到秒)
jni C/C++ 头文件:MyFileTime.h C/C++ code /* DO NOT EDIT THIS FILE - it is machine generated */#include ...
- kafka集群和zookeeper集群的部署,kafka的java代码示例
来自:http://doc.okbase.net/QING____/archive/19447.html 也可参考: http://blog.csdn.net/21aspnet/article/det ...
- HDU 2096 小明A+B --- 水题
HDU 2096 /* HDU 2096 小明A+B --- 水题 */ #include <cstdio> int main() { #ifdef _LOCAL freopen(&quo ...
- 记事本写JAVA程序
编写程序源码: 1.新建记事本程序,修改文件名称为HelloWorld.java 打开编辑以下内容,保存. public class HelloWorld { public static void m ...