Plugin开发基本知识点 Plugin Pipeline Pre-Validation, Pre-Operation, Post-Operation
在Microsoft Dynamics 365插件开发中,插件可以注册在不同的事件管道阶段,这些阶段决定了插件的执行时机。常见的三个阶段是预验证(Pre-Validation)、预操作(Pre-Operation)和后操作(Post-Operation)。每个阶段都有其特定的用途和执行顺序。以下是对这三个阶段的详细解释及其用法:
1. Pre-Validation 阶段
定义:
Pre-Validation阶段是在数据库事务之外、在所有其他处理之前执行的。这意味着在此阶段执行的插件不会在数据库事务中被回滚。
用途:
- 检查和验证输入数据是否符合业务规则。
- 执行一些不需要数据库事务保护的操作。
- 可以用于在操作实际提交到数据库之前终止操作。
**示例用法:**
public class PreValidationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context.MessageName == "Create" && context.Stage == 10) // Pre-Validation阶段的Stage值为10 { Entity entity = (Entity)context.InputParameters["Target"]; // 验证数据逻辑,例如检查字段值是否符合要求 if (!entity.Contains("requiredField")) { throw new InvalidPluginExecutionException("Required field is missing."); } } } }
2. Pre-Operation 阶段
定义:
Pre-Operation阶段是在数据库事务之内,但在核心操作(如数据库插入、更新、删除)之前执行的。这意味着在此阶段执行的插件如果抛出异常,整个事务会被回滚。
用途:
- 修改或更新即将提交到数据库的数据。
- 执行一些需要数据库事务保护的操作。
- 可以在核心操作之前终止操作。
示例用法:
public class PreOperationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context.MessageName == "Update" && context.Stage == 20) // Pre-Operation阶段的Stage值为20 { Entity entity = (Entity)context.InputParameters["Target"]; // 修改即将提交的数据 if (entity.Contains("someField")) { entity["someField"] = "ModifiedValue"; } } } }
3. Post-Operation 阶段
定义:
Post-Operation阶段是在数据库事务之内、核心操作(如数据库插入、更新、删除)之后执行的。这意味着在此阶段执行的插件如果抛出异常,整个事务会被回滚。
用途:
- 处理核心操作之后的数据。
- 执行一些依赖于核心操作已经完成的逻辑。
- 可以用于与外部系统的集成,因为核心操作已经完成。
示例用法:
public class PostOperationPlugin : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context.MessageName == "Create" && context.Stage == 40) // Post-Operation阶段的Stage值为40 { Entity entity = (Entity)context.OutputParameters["id"]; // 执行依赖于创建操作完成后的逻辑 Guid createdEntityId = (Guid)context.OutputParameters["id"]; // 例如,发送通知或更新相关记录 } } }
总结
- Pre-Validation:在事务之外执行,用于验证输入数据。
- Pre-Operation:在事务之内,核心操作之前执行,用于修改即将提交的数据。
- Post-Operation:在事务之内,核心操作之后执行,用于处理核心操作完成后的逻辑。
选择合适的阶段来注册插件取决于你希望插件在何时执行以及需要确保哪些操作的原子性。