案例分析:

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

最新文章

  1. 使用Jmeter录制web脚本
  2. Rails : 产品环境(生产环境)的部署
  3. 研究base64_encode的算法
  4. Android——文件的保存和读取
  5. Font-Awesome for android
  6. 自己做站点(二) 20块钱搞定一个企业站:域名&空间申请
  7. hud 1312 Red and Black
  8. 【BZOJ4033】【HAOI2015】树上染色
  9. 附近的人,附近的卖家(geohash+前缀树)
  10. 实现JWT刷新机制以及让过期时间更精确
  11. mysql <=> null 问题
  12. VC维的来龙去脉——转载
  13. 锻造(forging)
  14. MySQL实验准备(二)--Python模拟数据(MySQL数据库)
  15. 第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置
  16. spring-boot-starter-data-elasticsearch 整合elasticsearch 5.x详解
  17. switch开关
  18. failed to load selinux policy freezing
  19. 【转】bmp文件格式详解
  20. BZOJ 3362 Navigation Nightmare 带权并查集

热门文章

  1. Ubuntu desktop 文件的书写格式
  2. CSS中的各种格式化上下文-FC(BFC)、IFC、GFC、FFC)
  3. C#DataTableRow列值互转
  4. Vue34 VueX
  5. 心酸部署dapr经历,最后一步莫名的遗憾
  6. [TJOI2007]书架
  7. CF1367E Necklace Assembly
  8. SQL 注入之一:Mysql 数据库(搞懂这篇就够了)
  9. .net mvc 权限验证 Filter(过滤器)
  10. VUE子组件使用父组件值并赋值