salesforce 零基础学习(五十二)Trigger使用篇(二)

第十七篇的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。

代码如下:

 1 public class Triggers {
 2
 3     public enum Evt
 4     {
 5         AfterDelete,
 6         AfterInsert,
 7         AfterUndelete,
 8         AfterUpdate,
 9         BeforeDelete,
10         BeforeInsert,
11         BeforeUpdate
12     }
13
14
15     public interface Handler
16     {
17         void handle();
18     }
19
20     Map<String, List<Handler>> eventHandlerMapping = new Map<String, List<Handler>>();
21
22     public Triggers bind(Evt event, Handler eh)
23     {
24         List<Handler> handlers = eventHandlerMapping.get(event.name());
25         if (handlers == null)
26         {
27             handlers = new List<Handler>();
28             eventHandlerMapping.put(event.name(), handlers);
29         }
30         handlers.add(eh);
31         return this;
32     }
33
34     public void execute()
35     {
36         Evt ev = null;
37         if(Trigger.isInsert && Trigger.isBefore)
38         {
39             ev = Evt.beforeinsert;
40         }
41         else if(Trigger.isInsert && Trigger.isAfter)
42         {
43             ev = Evt.afterinsert;
44         }
45         else if(Trigger.isUpdate && Trigger.isBefore)
46         {
47             ev = Evt.beforeupdate;
48         }
49         else if(Trigger.isUpdate && Trigger.isAfter)
50         {
51             ev = Evt.afterupdate;
52         }
53         else if(Trigger.isDelete && Trigger.isBefore)
54         {
55             ev = Evt.beforedelete;
56         }
57         else if(Trigger.isDelete && Trigger.isAfter)
58         {
59             ev = Evt.afterdelete;
60         }
61         else if(Trigger.isundelete)
62         {
63             ev = Evt.afterundelete;
64         }
65         List<Handler> handlers = eventHandlerMapping.get(ev.name());
66         if (handlers != null && !handlers.isEmpty())
67         {
68             for (Handler h : handlers)
69             {
70                 h.handle();
71             }
72         }
73     }
74 }

Triggers

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

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

1.F1Handler

1 public without sharing class F1Handler implements Triggers.Handler {
2     public void Handle(){
3         List<Company_Info__c> companyInfoList = trigger.new;
4         //TODO
5         //do something start
6         system.debug(‘===============executeF1Handler‘);
7         //do something end
8     }
9 }

2.F2Handler

1 public with sharing class F2Handler implements Triggers.Handler {
2     public void Handle(){
3         List<Company_Info__c> companyInfoList = trigger.new;
4         //TODO
5         //do something start
6         system.debug(‘===============executeF2Handler‘);
7         //do something end
8     }
9 }

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

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

 1 public without sharing class TriggerExecutionHelper {
 2     public static Boolean enableExecuteF1 {
 3         get{
 4             if(enableExecuteF1 == null) {
 5                 enableExecuteF1 = true;
 6             }
 7             return enableExecuteF1;
 8         }
 9         set;
10     }
11
12     public static Boolean enableExecuteF2{
13         get{
14             if(enableExecuteF2 == null) {
15                 enableExecuteF2 = true;
16             }
17             return enableExecuteF2;
18         }
19         set;
20     }
21
22 }

四.Trigger代码部分

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

 1 trigger CompanyInfoTrigger on Company_Info__c (after delete, after insert, after undelete, after update, before delete, before insert, before update) {
 2
 3     Triggers companyInfoTrigger = new Triggers();
 4     if(TriggerExecutionHelper.enableExecuteF1) {
 5         companyInfoTrigger.bind(Triggers.Evt.BeforeInsert, new F1Handler());
 6     }
 7
 8     if(TriggerExecutionHelper.enableExecuteF2) {
 9         companyInfoTrigger.bind(Triggers.Evt.BeforeInsert, new F2Handler());
10     }
11
12     companyInfoTrigger.Execute();
13
14 }

效果展示:

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

相关log可以查看执行结果

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

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

时间: 2024-10-15 13:02:30

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

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

看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigger_Best_Practices 2.http://chrisaldridge.com/triggers/lightweight-apex-trigger-framework/ 3.http://www.sfdc99.com/2015/01/19/the-one-trigger-per-object

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

Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Profile但是对于某个表,某个字段,或者某个Apex类等却可以有不同访问权限,这个时候就要用到Permission sets.  Permission sets 配置 1.点击setup->Administer->Manage Users->Permission Sets进入Permissio

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

项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随便的取一个审批人了,有以下方式针对不同的场景可以获取到当前记录的最终审批人以及审批意见. 邮件内容使用以下几种方式实现: 1.代码里面实现邮件发送 2.email template(text/html/custom) 3.visualforce emailTemplate 对发送邮件方式不清楚的,可

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

在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的使用此标签进行解析附件内容,后台只要声明String类型变量用来存储附件名称,Blob类型变量用来存储附件的内容即可. 但是当我们的项目整体使用第三方的前端框架,例如VUE或者angular等前端框架时,有时使用apex:inputFile反而不是很方便,需要用到html的原生的附件上传的标签<inpu

salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-from.html 群里面有个小伙伴问了一个关于两个有Dependence关系的Picklist字段如何在Apex中通过control字段的值获取到Dependence字段的值,针对Salesforce配置来说,我们很好配置出两个Dependence字段的关系,通过点击设置一下include关系即可.如

蓝鸥零基础学习HTML5第八讲 样式布局二

蓝鸥零基础学习HTML5第八讲 样式布局二 1.定位的属性及特性 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <style> #box1 { width:400px; height:400px; border:10px solid red; margin:0 auto; position: re

salesforce 零基础学习(二十五)PickList简单联动操作

有的时候,项目需要一些联动的操作,比如省和市之间的联动,不同的省应该显示不同的城市. 操作步骤如下: 1.新建provice字段,并且初始化相关的值 2.新建city字段,并且初始化相关的值 3.在Province的Field Dependencies 处点击New按钮,将其与city字段关联 4.选择字段间的依赖关系,其中Controlling Field为主字段,Dependent Field依赖于主,这里选择城市依赖于省,点击Continue继续 5.按照上述规则将相关省市配置,选择需要的

salesforce 零基础学习(二十)简单APP制作

本篇参考链接:https://developer.salesforce.com/trailhead/project/salesforce_developer_workshop 本篇讲述的是最简单的APP的制作,涵盖的知识点包括以下内容: 1.Object的创建; 2.Tab以及App创建; 3.Trigger创建; 4.Permission Sets创建; 5.Validation Rules 使用; 6.Schedule Job使用; 7.Layouts创建/修改; 8.Test创建. 一.创

salesforce零基础学习(八十五)streaming api 简单使用(接近实时获取你需要跟踪的数据的更新消息状态)

Streaming API参考链接: https://trailhead.salesforce.com/en/modules/api_basics/units/api_basics_streaming https://resources.docs.salesforce.com/210/latest/en-us/sfdc/pdf/api_streaming.pdf 背景:工作中我们有可能会有这样相关的需求:某些数据很重要,需要实时监控是否有变化,或者某些数据在其他的平台有集成.如果有变化,不刷新页