FFLIB 是一個免費的框架页眯,對 Apex 進行了擴展梯捕。它的結(jié)構(gòu)實現(xiàn)了 Salesforce 推薦的Apex 企業(yè)設(shè)計模式。
在學(xué)習(xí)如何使用 FFLIB 框架之前窝撵,我們先來了解一下 Apex 企業(yè)設(shè)計模式的結(jié)構(gòu)傀顾。
Apex 企業(yè)設(shè)計模式
Apex 企業(yè)設(shè)計模式的結(jié)構(gòu)遵循了“關(guān)注點分離”的概念。
維基百科上對于“關(guān)注點分離”的定義是:
關(guān)注點分離(Separation of concerns碌奉,SOC)是對只與“特定概念短曾、目標”(關(guān)注點)相關(guān)聯(lián)的軟件組成部分進行“標識、封裝和操縱”的能力赐劣,即標識嫉拐、封裝和操縱關(guān)注點的能力。是處理復(fù)雜性的一個原則魁兼。由于關(guān)注點混雜在一起會導(dǎo)致復(fù)雜性大大增加婉徘,所以能夠把不同的關(guān)注點分離開來,分別處理就是處理復(fù)雜性的一個原則,一種方法盖呼。
關(guān)注點分離是面向?qū)ο蟮某绦蛟O(shè)計的核心概念儒鹿。分離關(guān)注點使得解決特定領(lǐng)域問題的代碼從業(yè)務(wù)邏輯中獨立出來,業(yè)務(wù)邏輯的代碼中不再含有針對特定領(lǐng)域問題代碼的調(diào)用(將針對特定領(lǐng)域問題代碼抽象化成較少的程式碼几晤,例如將代碼封裝成function或是class)约炎,業(yè)務(wù)邏輯同特定領(lǐng)域問題的關(guān)系通過側(cè)面來封裝、維護蟹瘾,這樣原本分散在整個應(yīng)用程序中的變動就可以很好的管理起來圾浅。
企業(yè)設(shè)計模式的實現(xiàn)分為以下四個部分:
- 服務(wù)層(Service Layer)
- 模型層(Domain Layer)
- 選擇邏輯層(Selector Layer)
- 工作單元(Unit of Work)
以上四個部分的詳細定義可以參考 Martin Fowler 的網(wǎng)站。
服務(wù)層
服務(wù)層的作用是提供一組函數(shù)热芹,將可重用的邏輯封裝起來贱傀,供外部調(diào)用。
這里的“外部”包括了外部的應(yīng)用程序和 Salesforce 本身的一些功能伊脓,比如 Visualforce 頁面的控制器府寒、Salesforce 的 API 服務(wù)等。
代碼示例
用 Apex 建立一個服務(wù)類:
public with sharing class AccountService {
public static Account createAccount(String name) {
// 建立 Account 對象的邏輯
Account a = new Account(Name = name);
SavePoint sp = Database.setSavePoint();
try {
insert a;
} catch (Exception e) {
Database.rollback(sp);
throw e;
}
}
}
然后在其他代碼中(比如 Visualforce 頁面的控制器)就可以使用了:
Account a = AccountService.createAccount('HelloWorld Company');
模型層
每個模型層的類都是針對某個對象而創(chuàng)建报腔。模型層的類中封裝了針對相關(guān)對象的一系列邏輯株搔,比如對象被增刪修改之后需要自動執(zhí)行的操作等。
和服務(wù)層不同的是纯蛾,模型層中的邏輯是不會被外部調(diào)用的(但是可以被服務(wù)層調(diào)用)纤房。
在 Apex 中,觸發(fā)器類是典型的模型層的類翻诉。
選擇邏輯層
選擇邏輯層的作用是封裝了查詢相關(guān)對象的邏輯炮姨,從而將數(shù)據(jù)庫操作與其他的層分離。
代碼示例
用 Apex 建立一個選擇邏輯類:
public with sharing class AccountSelector {
public static Account selectById(Id id) {
// 通過 Id 查詢 Account 對象的邏輯
// ...
}
}
然后在其他代碼中(比如服務(wù)層或外部代碼)就可以使用了:
Account a = AccountSelector.selectById('XXXXXXXXXXXXXXXXXX');
工作單元
工作單元是一種設(shè)計模式碰煌,它負責(zé)保存在各個邏輯中被增刪修改的數(shù)據(jù)舒岸,并負責(zé)將這些數(shù)據(jù)的變化寫入數(shù)據(jù)庫。
對于 Apex 的開發(fā)芦圾,使用工作單元可以實現(xiàn)以下幾個方面:
- 記錄一系列被增刪修改的數(shù)據(jù)
- 記錄數(shù)據(jù)之間的關(guān)系
- 在將數(shù)據(jù)的變化保存到數(shù)據(jù)庫時蛾派,一次性寫入,提高系統(tǒng)性能
- 在將數(shù)據(jù)的變化保存到數(shù)據(jù)庫時个少,自動定義 SavePoint洪乍,在出現(xiàn)錯誤時自動回滾。這樣就減輕了開發(fā)者的工作
比如在 .NET 的 Entity Framework中夜焦,ObjectContext 和 DbContext 的設(shè)計就體現(xiàn)了工作單元的模式壳澳。