081_Introducing trigger handler class
2024-10-21 11:42:24
案例分析:
我们对一个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过程分开。 这种分离不是强制性的,但它有助于集中代码。
最新文章
- 使用Jmeter录制web脚本
- Rails : 产品环境(生产环境)的部署
- 研究base64_encode的算法
- Android——文件的保存和读取
- Font-Awesome for android
- 自己做站点(二) 20块钱搞定一个企业站:域名&;amp;空间申请
- hud 1312 Red and Black
- 【BZOJ4033】【HAOI2015】树上染色
- 附近的人,附近的卖家(geohash+前缀树)
- 实现JWT刷新机制以及让过期时间更精确
- mysql <;=>; null 问题
- VC维的来龙去脉——转载
- 锻造(forging)
- MySQL实验准备(二)--Python模拟数据(MySQL数据库)
- 第三百九十七节,Django+Xadmin打造上线标准的在线教育平台—其他插件使用说,主题本地化设置
- spring-boot-starter-data-elasticsearch 整合elasticsearch 5.x详解
- switch开关
- failed to load selinux policy freezing
- 【转】bmp文件格式详解
- BZOJ 3362 Navigation Nightmare 带权并查集