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过程分开。 这种分离不是强制性的,但它有助于集中代码。
此刻,静下心来学习