案例分析:

我们对一个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过程分开。 这种分离不是强制性的,但它有助于集中代码。

转载于:https://www.cnblogs.com/bandariFang/p/10455458.html

081_Introducing trigger handler class相关推荐

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

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

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

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

  3. KubeSphere 社区双周报 | 2022-09-02

    KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...

  4. 树莓派-Raspberry Pi Pico RP2040 使用大全(硬件接口功能、传感器模块等)

    树莓派-RP2040 主板实物图 主板引脚图 Thonny开发IDE工具 查看帮助信息 GPIO 输出 GPIO 输入 GPIO 中断 ADC(模数转换) PWM(脉宽调制) WDT看门狗 RTC实时 ...

  5. Silverlight实用窍门系列:61.Silverlight中的Trigger触发器,自定义翻页触发器

    在Silverlight应用程序和客户进行交互工作的时候可以不用写后台代码而通过Xaml代码来实现,在本文我们将学习了解Trigger触发器. Trigger触发器:引发动作的因素,比如鼠标点击.键盘 ...

  6. declare handler 声明异常处理的语法

    声明异常处理的语法 DECLARE {EXIT | CONTINUE} HANDLER FOR {error-number | SQLSTATE error-string | condition} S ...

  7. 给Event handler传递动态参数

    有段时间没写些东西了......参加工作大半年 感觉是收获不小啊 新年以致 在这里我想真心的祝福所有园友 所有有梦想的人 新的一年技术更牛X 身体棒棒 职业发展更上一层 好了 回过来讲主要内容. 在j ...

  8. 透过 In-memory Channel 看 Knative Eventing 中 Broker/Trigger 工作机制

    In-memory Channel是当前Knative Eventing中默认的Channel, 也是一般刚接触Knative Eventing首先了解到的Channel.本文通过分析 In-memo ...

  9. mysql ha_err_key_not_found_mysql主从同步报错:Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND...

    Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND 造成1032错误的根本原因是主从数据库数据不一致,导致同步操作在从库上无法执行. 造成1032 ...

最新文章

  1. OpenStack Nova 高性能虚拟机之 CPU 绑定
  2. Android非空格式验证框架Validation的使用---第三方库学习笔记(四)
  3. 108-学习如何格式化字符串
  4. 图片宽度自适应浏览器宽度
  5. 基于canvas的骨骼动画
  6. Python常用小技巧(二)——打开图片
  7. [C++] - lambda capture的成员函数 异步调用
  8. Android 系统性能优化(25)---Dalvik 与ART
  9. 打不开_笔记本电脑摄像头打不开怎么办
  10. Java自定义Annotation方法
  11. 13. jQuery - 设置内容和属性
  12. mybatis 实现查询商品列表的分页
  13. Linux下使用QQ
  14. 1 常见的HTTP股票数据接口整理 腾讯 新浪 网易 2019-08-02
  15. iphone拍照标注转发微博应用--Gurgle 发布
  16. visio增加连接点
  17. 校园服务微信小程序-跑腿代购,失物招领,二手商城
  18. lly的瞬移方块(并查集)
  19. 微信翻译出 Bug 上热搜,程序员又背锅?!
  20. 如何将WORD转成SWF

热门文章

  1. 匿名类型和Object转换
  2. 《UG NX8.0中文版完全自学手册》一第1章 UG NX 8.0简介
  3. Vue.js学习系列(四十二)-- Vue.js组件
  4. Centos 不小心删除了openssl,导致无法使用sshd、yum、wget、curl 等软件的问题。。...
  5. 基于html5海贼王单页视差滚动特效
  6. iOS 设置UILabel 的内边距
  7. 大家帮忙.谢谢!..(急急急急急)
  8. 27.3. source code
  9. 在ARC环境中autoreleasepool(runloop)的研究
  10. 堆排序示例-java