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