目录
1. 插件
插件是可与 Microsoft Dynamics CRM 2016 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑,用于修改或扩展平台的标准行为。插件是事件处理程序,因为其是注册要执行的插件,用于响应平台触发的特定事件。
2. 事件框架
用于开发自定义代码并将其集成到Microsoft Dynamics CRM服务器中的技术称为事件框架。
事件框架关键功能
(1)改进的事件处理子系统:该子系统提供统一的方法来执行插件和工作流活动,这可以改进可靠性、增强功能集以及改进插件的灵活性。
(2)事件框架API:用于通过以插件和工作流活动的形式开发自定义业务逻辑来扩展Microsoft Dynamics CRM平台。
(3)用于将插件和自定义工作流活动部署到Microsoft Dynamics CRM数据库的API。通过将插件和工作流活动部署到数据库,可以将插件和自定义工作流活动自动分发给整个数据中心中运行Microsoft Dynamics CRM服务的服务器。
(4)同步和异步执行插件:作为主Microsoft Dynamics CRM事件处理的一部分以预定义的顺序执行同步插件。异步插件会排队,然后独立执行。
3.事件执行管道
Dynamics Dynamics CRM事件处理子系统根据消息管道执行模型执行插件。Microsoft Dynamics CRM Web应用程序中的用户操作或者插件或其他应用程序执行的SDK方法调用会导致将消息发送到组织Web服务。该消息包含业务实体信息和核心操作信息。该消息是通过事件执行管道传递的,平台核心操作和任何注册的插件都可以在事件执行管道中读取或修改它。
(1)体系结构和相关组件
事件执行管道可以通过同步或异步方式处理事件。
平台核心操作和为同步执行注册的所有插件都会立即执行。为事件注册的同步插件按明确定义的顺序执行。为异步执行注册的插件由异步队列代理放入队列中并在稍后由异步服务执行。
(2)管道阶段
重要活动 | 阶段名称 | 阶段编号 | 说明 |
---|---|---|---|
前期事件 | 预验证 | 10 | 管道中的一个阶段,其中的插件在主系统操作之前执行。在此阶段注册的插件可能会在数据库事务外部执行。 |
前期事件 | 预操作 | 20 | 管道中的一个阶段,其中的插件在主系统操作之前执行。在此阶段注册的插件将在数据库事务内部执行。 |
平台核心操作 | 主操作 | 30 | 系统的事务内主操作,例如创建、更新和删除等等。在该阶段中不可以注册自定义插件。仅供内部使用。 |
后期事件 | 后操作 | 40 | 管道中的一个阶段,其中的插件在主系统操作之后执行。在此阶段注册的插件将在数据库事务内部执行。 |
(3)消息处理
当应用程序代码或工作流调用Microsoft Dynamics CRM Web服务方法时,会更改系统中的状态,这将引发一个事件。作为参数传递到 Web 服务方法的信息会在内部打包成OrganizationRequest 消息,并由管道处理。OrganizationRequest 消息中的信息会传递到为该事件注册的第一个插件,且在传递到该事件的下一个注册插件之前可以对其读取或修改,依次类推。插件会以传递到 Execute 方法的上下文的形式接收消息信息。该消息也会传递到平台核心操作。
(4)插件注册
可以在核心平台操作之前或之后注册要执行的插件。前期事件注册的插件会首先接收 OrganizationRequest 消息,并且在将该消息传递到核心操作之前可以修改该消息信息。核心平台操作完成后,该消息则称为OrganizationRequest 。响应会传递到注册的后期事件插件。后期事件插件可以在响应的副本传递到任何注册的异步插件之前修改消息。最后,响应返回到调用原始 Web 服务方法调用的应用程序或工作流。
因为单个 Microsoft Dynamics CRM 服务器可以承载多个组织,所以执行管道是特定于组织的。每个组织都有一个虚拟管道。使用该管道注册的插件仅能处理单个组织的业务数据。可处理多个组织的插件必须使用每个组织的执行管道进行注册。
(5)在数据库事务中执行
插件可以在也可以不在 Microsoft Dynamics CRM 平台的数据库事务中执行。插件是否是事务的一部分取决于管道处理消息请求的方式。您可以通过读取传递给插件的IPluginExecutionContext所继承的IsInTransaction 属性,检查插件是否正在事务中执行。如果插件正在数据库事务中执行,并且允许将例外传递回到平台,则整个交易将回滚。阶段 20 和 40 一定是数据库事务的一部分,而阶段 10 可以是事务的一部分。
在数据库事务中执行并且将异常传递回平台的任何注册插件都会取消平台操作。这会导致核心操作回滚。此外,尚未执行的任何前期事件或后期事件注册插件以及为其注册插件的同一事件触发的任何工作流都不会执行。