背景:不了解我的人如果只看過我的博客,會以為我是一個發亮稀少,或者表情嚴肅的程序狗。但是其實和我做過項目的基本都知道,我是一個年紀輕輕騷話不斷的小逗比。以此為背景,前幾天同事問我說岳奇,我有一段代碼是公用的邏輯,但是想在trigger和batch都共用到,兩個邏輯差不多,區別就是那么一小點點。怎樣才能判斷當前這個方法運行的上下文是在trigger里面還是batch里面啊。此時的我就和他說:哦我的上帝,先必應,在谷歌,找不到解決方案再找我,我就可以和你很自信的說這個實現不了了,搞定~~~當然,玩笑歸玩笑,本着朋友的信任,基本上朋友問的問題我都知無不言,所以我說,以我干salesforce 開發5年的經驗來看,這個確實好像實現不了,只能告訴你如果想知道是否batch運行可以System.isBatchable()。我對apex的概念還是有點落后的,之前apex develop guide沒事確實也掃過一遍,當時掃的時候還是V36.0,現在都已經看不到了。
這幾天對象出差,在家呆着刷劇也無聊,尋思好久沒有看最新release的開發文檔了,掃一掃哪些好用的新功能,混個臉熟。結果我發現前幾天的回復是多么的無知,特此寫下此篇,告誡自己不要太自負,溫故而知新,說以前先多查查,多確定。
一. Quiddity
Quiddity是salesforce winter21新加的枚舉類,apex如果使用,api version需要50及以上。我們通過上面的連接可以看到這個枚舉類中包含的枚舉元素。元素很多,找幾個單獨說一下:
- ANONYMOUS: 匿名塊或者develop console執行的代碼,運行時環境將會是 ANONYMOUS;
- AURA: 通過aura或者lwc調用的代碼,運行時環境將會是AURA,需要注意的是,目前至少在API 51的版本上,無法區分當前運行的是aura還是lwc,以后有可能會改善吧;
- BATCH_APEX:當前運行代碼環境是batch job場景;
- FUTURE:當前運行代碼環境是feature場景;
- QUICK_ACTION:當前運行的代碼環境是 quick action;
- REMOTE_ACTION:通常用於classic場景的 remote action;
- SYNCHRONOUS:通常用於trigger等代碼同步運行的場景;
- VF: 通過VF page去觸發的場景。
還有很多其他的枚舉元素用於不同的場景,感興趣的自行查看,那么如何在apex中獲取當前的枚舉呢,更簡單了。只需要通過 Request獲取當前的請求,然后調getQuiddity即可。具體如下:
//Get info about the current request Request reqInfo = Request.getCurrent(); //Get the identifier for this request, which is universally unique //Same as requestId in splunk or REQUEST_ID in event monitoring String currentRequestId = reqInfo.getRequestId(); //Enum representing how Apex is running. e.g. BULK_API vs LIGHTNING Quiddity currentType = reqInfo.getQuiddity(); //Use this with a switch statement, //instead of checking System.isFuture() || System.isQueueable() || ...
通過上面的博客鏈接,我們可以對這個功能做更好的拓展,做一個功能閥,保證我們的代碼只在部分場景運行。可擴展性很多,大家可以基於自身的業務去進行使用。下面截圖是上述相似代碼trigger上下文的apex class的執行結果。
總結:本篇本來還想介紹一下Security的stripInaccessible方法實現sf針對數據訪問權限的安全化策略,后來過了一遍新的文檔,發現還是有好多更新的內容沒有查看,作罷了越更越多的特性點,還是推薦個人可以自己養成自我學習的習慣。篇中有錯誤歡迎指出,有不懂歡迎留言。自信是好東西,前提是有支撐着你自信的能力,我這次很慚愧。技術不斷的更新變化,擁抱變化,不斷努力。共勉。