zoukankan      html  css  js  c++  java
  • 081_Introducing trigger handler class

    案例分析:

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

    此刻,静下心来学习
  • 相关阅读:
    SQL语句中case函数
    动态获取数据库表中的字段名
    Java实现最基本的集中排序
    服务器上产看报错的日志的方法
    数据结构顺序表Java实现
    JavaScript创建对象
    JavaScript的基础语法
    javascript介绍
    Java小项目迷你图书管理系统
    CDN——到底用还是不用?
  • 原文地址:https://www.cnblogs.com/bandariFang/p/10455458.html
Copyright © 2011-2022 走看看