首页 > 其他分享 >Plugin开发基本知识点 Plugin Pipeline Pre-Validation, Pre-Operation, Post-Operation

Plugin开发基本知识点 Plugin Pipeline Pre-Validation, Pre-Operation, Post-Operation

时间:2024-07-03 17:41:27浏览次数:16  
标签:Pre 插件 Plugin context 操作 Operation IPluginExecutionContext

在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:在事务之内,核心操作之后执行,用于处理核心操作完成后的逻辑。

选择合适的阶段来注册插件取决于你希望插件在何时执行以及需要确保哪些操作的原子性。

标签:Pre,插件,Plugin,context,操作,Operation,IPluginExecutionContext
From: https://www.cnblogs.com/TheMiao/p/18282276

相关文章

  • Plugin开发基本知识点 IPluginExecutionContext, iOrganization Service
    IPluginExecutionContext`IPluginExecutionContext`接口在MicrosoftDynamics365插件开发中用于获取有关当前插件执行上下文的信息。它提供了丰富的属性和方法,帮助开发者在插件执行时获取与当前操作相关的各种数据和元数据。以下是`IPluginExecutionContext`的一些主要功能和属......
  • python编写使用xmlrpc上传wordpress网站文章的程序
    1、安装库        pipinstallpython-wordpress-xmlrpc,tkinter,xmlrpc,json2、发布文章url="http://域名/xmlrpc.php"username=用户名password=密码title=标题content=内容tags=标签categories=分类client=C......
  • 01 | 为什么MapReduce会被硅谷一线公司淘汰?
    今天我要与你分享的主题是“为什么MapReduce会被硅谷一线公司淘汰”。我有幸几次与来Google参观的同行进行交流,当谈起数据处理技术时,他们总是试图打探MapReduce方面的经验。这一点让我颇感惊讶,因为在硅谷,早已没有人去谈论MapReduce了。今天这一讲,我们就来聊聊为什么......
  • WordPress付费进群V2主题,多种引流方法,引私域二次变现
    全新前端UI界面,多种前端交互特效让页面不再单调,进群页面群成员数,群成员头像名称,每次刷新页面随机更新不重复,最下面评论和点赞也是如此随机刷新不重复进群页面简介,群聊名称,群内展示,常见问题后台一键开关方便控制,付费进群系统后台自定义你的内容,底部显示你所设置的进群金额,也......
  • DevExpress WPF中文教程:Grid - 如何显示摘要(设计时)?
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • VuePress 的更多配置
    08.更多配置现在,读者应该对VuePress、主题和插件等有了基本的认识,除了插件,VuePress自身也有很多有用的配置,这里简单说明下。‍‍VuePress的介绍在介绍了VuePress的基本使用、主题和插件的概念之后,我们再来看看官网对于VuePress的介绍,就很好理解了:VuePress由两部分......
  • 李沐动手学深度学习V2-chap_preliminaries
    李沐动手学深度学习V2文章内容说明本文主要是自己学习过程中的随手笔记,需要自取课程参考B站:https://space.bilibili.com/1567748478?spm_id_from=333.788.0.0课件等信息原视频简介中有CSV文件修改读取成张量tensor数据预处理首先(创建一个人工数据集,并存储在CSV(逗号分隔值......
  • 打包警告:chunk common [mini-css-extract-plugin]Conflicting order between:
    1.问题webpage5打包告警:chunkcommon[mini-css-extract-plugin]Conflictingorderbetween:2.解决方案:-vue.config.js配置//vue.config.jsmodule.exports={//...,css:{extract:{ignoreOrder:true},}};或者:调整组件引入的顺序3.......
  • 如何更改Wordpress语言为中文
    在使用WordPress的时候,一般安装默认语言是英文,可以在后台设置里面直接修改站点语言为简体中文,当后台没有语言选项框的这一栏,如下图所示,该怎么办呢? 这个时候我们可以找到文件wp-config.php文件,添加一行代码  define('WPLANG','zh_CN');  保存后,然后我们回到后台到设置......
  • C++编译问题,解决arm下链接静态库,引起的relocation R_AARCH64_ADR_PREL_PG_HI21 agains
    显示的完整错误如下:relocationR_AARCH64_ADR_PREL_PG_HI21againstsymbol`ZN2c43yml9free_implEPvmS1'whichmaybindexternallycannotbeusedwhenmakingasharedobject;recompilewith-fPIC根据提示,在链接.a静态库时,应该在编译时加上参数-fPIC然而CMake文件中已......