案例分析:

我们对一个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. angular---处于激活状态的路由加样式

  2. Java入门与进阶 P4.1+P4.2

    表达积累的结果应该初始化为1 for循环 for循环像一个计数循环:设定一个计数器,初始化它,然后再计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步骤进行调整,比如加 i 或者减 ...

  3. YonBuilder移动开发平台App拉起第三方应用

    在App的开发过程中,有一种常见场景,就是拉起第三方app,那么使用YonBuilder移动开发做app的时候,是怎么拉起第三方App的呢,下边我们讲一下步骤. 我们以安卓应用打开支付宝为例进行说明: ...

  4. nexus私服搭建的上传和下载

    下载 方法1 下载应该先在nexus中创建相关的库(宿主库.代理库.仓库组),也可以使用原有的库 随后在pom文件中增加以下代码,即可从私服中下载相关的依赖包(注:依赖包的下载首先基于本地库,本地库没 ...

  5. SpringBoot项目启动后再请求远程接口的实现方式

    场景 有一个SpringBoot项目需要在启动后请求另一个远程服务拿取配置,而不是加载过程中去请求,可能会出现类没有实例化的场景,因此需要实现项目完全启动后再进行请求的场景. 解决 一般会有两种实现方 ...

  6. Html音频播放代码

    页面代码: <html> <head> <script src="https://code.jquery.com/jquery-3.1.1.min.js&quo ...

  7. P29_全局配置 - window - 导航栏

    window 了解 window 节点常用的配置项 设置导航栏的标题 设置步骤:app.json -> window -> navigationBarTitleText 需求:把导航栏上的 ...

  8. Java基础语法:注释、数据类型、字节

    Java基础语法:注释.数据类型.字节 注释 单行注释:// 多行注释:/* 注释 */ 文档注释:/** 注释 */ 数据类型分为两大类:基本类型和引用类型 八大基本数据类型 整数类型 byte(占 ...

  9. JZOJ 100149. 一道联赛A题

    \(\text{Solution}\) 一眼 \(ODT\) 为避免每次都数颜色数量,提前记录下来,每次修改更新下 \(\text{Code}\) #include <cstdio> #i ...

  10. 李超树学习笔记 & JZOJ 5039. 【NOI2017模拟4.2】查询题解

    李超树 它本质上是线段树的拓展运用 解决的问题:平面直角坐标系中,支持插入线段,问 \(x = x_0\) 这条直线上最大的 \(y\) 值 它维护的东西很奇特:优势线段 何为"优势线段&q ...