第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰。

十七篇链接:salesforce 零基础学习(十七)Trigger用法

有的时候对于sObject的trigger处理复杂的情况下,比如一个sObject的before update要实现功能1,2.....n功能情况下,Handler中需要在before update写实现功能1--n的代码。然而有些时候,我们在执行update情况下只需要让他触发功能i的功能代码,使用上述Handler方法也可以搞定,只不过处理起来比较尴尬,此篇针对trigger中对于不同业务分成模块进行处理。

一.Triggers基类

Triggers基类主要有以下内容:

1.枚举:封装的枚举包含了Trigger中的所有情况;

2.Handler接口:此接口中声明了一个方法handle,所有实现此接口的类都需要重写次方法;

3.bind方法,用于绑定事件以及实现Handler接口的类,即绑定的事件会使用实现Handler接口的类进行业务逻辑处理;

4.execute方法,用于执行triggers中绑定的Handler。

代码如下:

 public class Triggers {

     public enum Evt
{
AfterDelete,
AfterInsert,
AfterUndelete,
AfterUpdate,
BeforeDelete,
BeforeInsert,
BeforeUpdate
} public interface Handler
{
void handle();
} Map<String, List<Handler>> eventHandlerMapping = new Map<String, List<Handler>>(); public Triggers bind(Evt event, Handler eh)
{
List<Handler> handlers = eventHandlerMapping.get(event.name());
if (handlers == null)
{
handlers = new List<Handler>();
eventHandlerMapping.put(event.name(), handlers);
}
handlers.add(eh);
return this;
} public void execute()
{
Evt ev = null;
if(Trigger.isInsert && Trigger.isBefore)
{
ev = Evt.beforeinsert;
}
else if(Trigger.isInsert && Trigger.isAfter)
{
ev = Evt.afterinsert;
}
else if(Trigger.isUpdate && Trigger.isBefore)
{
ev = Evt.beforeupdate;
}
else if(Trigger.isUpdate && Trigger.isAfter)
{
ev = Evt.afterupdate;
}
else if(Trigger.isDelete && Trigger.isBefore)
{
ev = Evt.beforedelete;
}
else if(Trigger.isDelete && Trigger.isAfter)
{
ev = Evt.afterdelete;
}
else if(Trigger.isundelete)
{
ev = Evt.afterundelete;
}
List<Handler> handlers = eventHandlerMapping.get(ev.name());
if (handlers != null && !handlers.isEmpty())
{
for (Handler h : handlers)
{
h.handle();
}
}
}
}

Triggers

二.相关的实现Handler接口的类

此处例举两个类,分别实现Triggers.Handler并且实现相关的Handle方法

1.F1Handler

 public without sharing class F1Handler implements Triggers.Handler {
public void Handle(){
List<Company_Info__c> companyInfoList = trigger.new;
//TODO
//do something start
system.debug('===============executeF1Handler');
//do something end
}
}

2.F2Handler

 public with sharing class F2Handler implements Triggers.Handler {
public void Handle(){
List<Company_Info__c> companyInfoList = trigger.new;
//TODO
//do something start
system.debug('===============executeF2Handler');
//do something end
}
}

三.相关Trigger中Handler是否执行的Helper类

有的时候业务需要不同地方的入口进行相同的操作,需要执行不同的trigger业务模块,比如在controller正常的更新需要全部执行trigger方法模块,在其他trigger中更新此sObject则只需要一部分模块,这个时候需要相关Helper类方法来控制是否执行哪块逻辑。

 public without sharing class TriggerExecutionHelper {
public static Boolean enableExecuteF1 {
get{
if(enableExecuteF1 == null) {
enableExecuteF1 = true;
}
return enableExecuteF1;
}
set;
} public static Boolean enableExecuteF2{
get{
if(enableExecuteF2 == null) {
enableExecuteF2 = true;
}
return enableExecuteF2;
}
set;
} }

四.Trigger代码部分

trigger代码部分用来判断是否需要执行哪些情况trigger

 trigger CompanyInfoTrigger on Company_Info__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) {

     Triggers companyInfoTrigger = new Triggers();
if(TriggerExecutionHelper.enableExecuteF1) {
companyInfoTrigger.bind(Triggers.Evt.BeforeInsert, new F1Handler());
} if(TriggerExecutionHelper.enableExecuteF2) {
companyInfoTrigger.bind(Triggers.Evt.BeforeInsert, new F2Handler());
} companyInfoTrigger.Execute(); }

效果展示:

1.通过系统页面插入一条数据,默认走全部的trigger内容

相关log可以查看执行结果

2.通过匿名块执行insert则只执行trigger中一个业务模块代码

总结:如果业务逻辑特别清晰并且可以分模块处理,则可以使用此种方法,达到的效果为业务清晰明了,后期人员也便于维护。缺点为如果相关模块的Handler都对一个字段进行处理,则会有相关先后处理的问题以及出bug调试时间增多等,具体使用哪种还是看具体的业务以及个人使用习惯,业务简单直接写在trigger中也未尝不可。篇中有问题地方欢迎指出,有不懂的欢迎留言。

salesforce 零基础学习(五十二)Trigger使用篇(二)的更多相关文章

  1. 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  2. salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  3. salesforce 零基础学习(十九)Permission sets 讲解及设置

    Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...

  4. salesforce 零基础学习(十八)WorkFlow介绍及用法

    说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...

  5. salesforce 零基础学习(十六)Validation Rules & Date/time

    上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...

  6. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  7. salesforce零基础学习(一百零五)Change Data Capture

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...

  8. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  9. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

随机推荐

  1. jquery的animate({})动画整理

    在网页制作的过程中少不了用到各种动画,形式多种多样,flash,css,js,canvas,等等都能实现,对于其优劣和效果只能说各有千秋. 什么是动画效果,其实网页中的渐变效果就是一种很基础的动画,动 ...

  2. jquery函数理解与运用

    javascript中有多种不用的方式去理解函数,函数类似于我们以前学过的数学函数,但是在程序设计中,我是按照下面的方式进行理解: 函数的理解: 函数是一个代码块,内容被包含在函数内,通常我们是把一些 ...

  3. python urllib

    在伴随学习爬虫的过程中学习了解的一些基础库和方法总结扩展 1. urllib 在urllib.request module中定义下面的一些方法 urllib.request.urlopen(url,d ...

  4. 我的Python学习之路 Python的初识与准备工作

    注:文笔不好,不喜勿喷,当个段子看看就好 一.初识Python 第一次听到Python是在2016年大概暑假 时候(即将大三),因为对黑客技术的蜜汁热爱(虽然自己并不会),在玄魂大大的公众微信号中看到 ...

  5. 调用0A中断输入字符串数据段的DUP定义

    ;这是自动生成的代码模板 STACKS SEGMENT STACK ;堆栈段 DW DUP(?) ;注意这里只有128个字节 STACKS ENDS DATAS SEGMENT ;数据段 STRING ...

  6. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  7. solr 添加索引

    添加索引模板: <add> <doc> <field name="employeeId">05991</field> <fie ...

  8. [翻译] ORMLite document -- How to Use Part (一)

    前言 此文档翻译于第一次学习 ORMLite 框架,如果发现当中有什么不对的地方,请指正.若翻译与原文档出现任何的不相符,请以原文档为准.原则上建议学习原英文文档. ----------------- ...

  9. 分布式大数据高并发的web开发框架

    一.引言 通常我们认为静态网页html的网站速度是最快的,但是自从有了动态网页之后,很多交互数据都从数据库查询而来,数据也是经常变化的,除了一些新闻资讯类的网站,使用html静态化来提高访问速度是不太 ...

  10. XVI Open Cup named after E.V. Pankratiev. GP of Ekaterinburg

    A. Avengers, The 留坑. B. Black Widow 将所有数的所有约数插入set,然后求mex. #include<bits/stdc++.h> using names ...