案例分析:

我们对一个Object写多个独立得Trigger。 但最终这不是最好的做法。

在Salesforce中,只为每个SObject设置一个触发器总是好的

原因:每个独立触发器的执行顺序始终未定义。

因此,如果我们有多个触发器,它可能会导致不可预测的行为。

但是,想一想。 由于触发器没有单独的方法,如果我们将多个逻辑放入一个单独的触发器中,它可能会非常混乱。 现在我们只有两个触发器组合在一起,它已经变得凌乱而且可读性差。 那么现实世界的企业级项目呢?

这是我们想要引入TriggerHandler类的主要原因。

在Salesforce中,最好的做法是使Trigger与实际业务逻辑保持一致,并将逻辑代码放入TriggerHandler类中。

另外TriggerHandler 可以解决 Trigger无法处理的问题:

①with sharing

②@Test

③不能共享逻辑代码

trigger objectTrigger on Object (after delete, after insert, after undelete, after update, before delete, before insert, before update) {

    objectTriggerHandler handler = new objectHandler();

    /* Before Insert */
    if(Trigger.isInsert && Trigger.isBefore){
        handler.OnBeforeInsert(Trigger.new);
    }
    /* After Insert */
    else if(Trigger.isInsert && Trigger.isAfter){
        handler.OnAfterInsert(Trigger.new);
    }
    /* Before Update */
    else if(Trigger.isUpdate && Trigger.isBefore){
        handler.OnBeforeUpdate(Trigger.old, Trigger.new, Trigger.newMap);
    }
    /* After Update */
    else if(Trigger.isUpdate && Trigger.isAfter){
        handler.OnAfterUpdate(Trigger.old, Trigger.new, Trigger.newMap);
    }
    /* Before Delete */
    else if(Trigger.isDelete && Trigger.isBefore){
        handler.OnBeforeDelete(Trigger.old, Trigger.oldMap);
    }
    /* After Delete */
    else if(Trigger.isDelete && Trigger.isAfter){
        handler.OnAfterDelete(Trigger.old, Trigger.oldMap);
    }     /* After Undelete */
    else if(Trigger.isUnDelete){
        handler.OnUndelete(Trigger.new);
    } }

 

public with sharing class ObjectTriggerHandler {

    private boolean m_isExecuting = false;

    public ObjectTriggerHandler(boolean isExecuting){
        m_isExecuting = isExecuting;
    }     public void OnBeforeInsert(Object[] newObjects){
        // EXECUTE BEFORE INSERT LOGIC
    }     public void OnAfterInsert(Object[] newObjects){
        // EXECUTE AFTER INSERT LOGIC
    }     public void OnBeforeUpdate(Object[] oldObjects, Object[] updatedObjects, MapObjectMap){
        // BEFORE UPDATE LOGIC
    }     public void OnAfterUpdate(Object[] oldObjects, Object[] updatedObjects, MapObjectMap){
        // AFTER UPDATE LOGIC
    }     public void OnBeforeDelete(Object[] ObjectsToDelete, MapObjectMap){
        // BEFORE DELETE LOGIC
    }     public void OnAfterDelete(Object[] deletedObjects, MapObjectMap){
        // AFTER DELETE LOGIC
    }     public void OnUndelete(Object[] restoredObjects){
        // AFTER UNDELETE LOGIC
    }     public boolean IsTriggerContext{
        get{ return m_isExecuting;}
    }
}

  实际上,我们稍后会使这个TriggerHandler方法更加严格。 但现在这是一个比前一个更好的版本。

为什么? 首先,它将业务逻辑与触发器本身分开。

所以从现在开始,如果我们想在现有的触发器中添加更多的逻辑,我们可以简单地在现有的类中添加一个新方法 - 而不是添加一个新的触发器,或者直接在我们的触发器代码中添加一些代码,这最终会使它成为现实。

非常难以理解。其次,它将数据初始化过程,数据过程和最终DML过程分开。 这种分离不是强制性的,但它有助于集中代码。

081_Introducing trigger handler class的更多相关文章

  1. Qunar实习回顾总结

    今天教师节,陪老师喝点小酒,回来难得抽空,整理一下实习阶段的那些零零碎碎却很有用的知识. 1.关于页面中嵌入js代码 (1)有时为了精确控制代码执行顺序流,会将js代码嵌入到网页之中.优点:改变代码触 ...

  2. linux运维、架构之路-Git+Jenkins实现自动化部署

    一.Jenkins介绍          jenkins是一个用JAVA编写的开源的持续集成工具,运行在servlet容器中,支持软件配置管理(SCM)工具,可以执行基于APACHE ANT和APAC ...

  3. Dapr | 云原生的抽象与实现

    引言 Dapr 是微软主导的云原生开源项目,2019年10月首次发布,到今年2月正式发布 V1.0 版本.在不到一年半的时间内,github star 数达到了 1.2 万,超过同期的 kuberne ...

  4. 树莓派 PICO基础教程(基于MicroPython)

    目录 1 树莓派 PICO 简介 1.1 简介 1.2 配置 [^2] 1.3 引脚图 1.4 尺寸 2 安装 2.1 烧录固件 2.2 安装IDE(Thonny IDE) 2.3 离线运行程序 3 ...

  5. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...

  6. vue.js中英文api

    全局配置 Vue.config is an object containing Vue's global configurations. You can modify its properties l ...

  7. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  8. salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  9. trigger()的event事件对象之坑

    问题引入,先贴一段有问题的代码,如果你对 trigger()  这个函数了解不透彻,还真看不出这段代码错在哪.完成的功能是样式转换器,想让页面在加载后自行触发点击事件隐藏三个按钮,但是效果如图并没有隐 ...

  10. Executing a script from Nagios event handler fails to run

    I have Nagios running on a webserver. For this one Nagios service check in particular, if it fails, ...

随机推荐

  1. Ubuntu 安装 samba 服务器

    下载 samba 工具 sudo apt install samba samba-common 配置 sudo vim /etc/samba/smb.conf // 复制到san.conf最下面 [u ...

  2. ES中的内置对象--jquery如何优化代码,少用$进行查找,减少查找次数的方法

  3. SSM进行Query

    在查询之前,需要输入数据库字段的名称,s_id需要获取

  4. Azure Terraform(十二)利用 Terraform 将文件上传到 Azure Blob Storage

    一,引言 本篇文章中,我门将学习如何利用 Terraform 将 文件以及文件夹上传到 Azure Blob Storage,这个对于我们来说很方便,可以将一些不重要的内容也存储在源代码管理工具中! ...

  5. 【Python】bytes和hex字符串之间的相互转换

    十六进制字符串:a="CC DD 01 61 F6 01 00 64 A4 81 00 00 00 8B" b=bytes.fromhex(a) 转为字节 from socket ...

  6. Web前端--HTML+Canvas+Js实现3D魔方小游戏

    一.案列效果 二.案例思路 1.先将平面上的6个DIV拼接在一起.形成一张类似于3d立方体图形展开的平面图. 2.我们需要将每一个面旋转到相应的位置上,每一个面的旋转轴都是不一样的.上下,左右,分别对 ...

  7. mybatis学习日记2

    1.mybatis中的连接池 配置的位置:  主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是用来表示采用何种连接方式 mybatis连接池提供了3种方式的配置 ...

  8. vue+element 返回数组或json数据自定义某列显示的处理--两种方法

    本文是作者开发一个业务需求时,将返回数据列表的其中一个数据长度很长的字段处理成数组,并将其作为子表显示的过程,具体样式如下(数据做了马赛克处理) 返回的过长字段数据处理(用分号分隔的一个长字段): t ...

  9. 鼎阳SDS6204长波形读取的潜力挖掘及上海光源测试

    ​​​ https://blog.csdn.net/weixin_43767046/category_11089525.html 上学期我搭建起来的逐束团3维质心位置测量系统一直是获取500us长的一 ...

  10. vant组件,picker时间选择,自定义时间选择,实现datePacker,时间选择长期,增加长期选项,用于选择身份证到期时间等...

    vant组件,picker时间选择,自定义时间选择,实现datePacker,时间选择长期,增加长期选项,用于选择身份证到期时间等... 最近项目中有个需求,datePicker选项,需要实现增加一个 ...