|
在討論完四種模式之后,我將會(huì)和大家一起來(lái)看看DDD的一些知識(shí)。每種模式的講解,我都會(huì)用實(shí)例的形式給出完整的代碼,也希望大家多琢磨!
不是所有的應(yīng)用程序都是一樣的,也不是所有的系統(tǒng)都需要用復(fù)雜的架構(gòu)來(lái)組織業(yè)務(wù)邏輯。作為開(kāi)發(fā)人員,我們必須清楚每一種業(yè)務(wù)邏輯組織的模式,這樣我們才能在需要的時(shí)候做出合適的選擇。
Transaction Script
這種組織業(yè)務(wù)邏輯的模式是最簡(jiǎn)單,也是最容易理解的。Transaction Script模式就是用面向過(guò)程的方式來(lái)組織業(yè)務(wù)邏輯的。通常情況下,系統(tǒng)的一個(gè)流程就被實(shí)現(xiàn)為一個(gè)方法,然后把所有的這些方法組織在一起,放在一個(gè)靜態(tài)的manager類(lèi)或者service 類(lèi)中。實(shí)現(xiàn)流程的那個(gè)方法包含了業(yè)務(wù)邏輯的Check和Validation,數(shù)據(jù)的持久化以及其他的一些相關(guān)操作。也就是說(shuō),一個(gè)方法把所有的事情都做完了。當(dāng)然,有時(shí)候這個(gè)大的方法還可能被拆成小的方法,便于重用。如下圖所示:
Transaction Script一個(gè)好處就是理解起來(lái)很簡(jiǎn)單,尤其是當(dāng)Team中的一個(gè)新成員來(lái)說(shuō),更是如此,因?yàn)樗麕缀醪挥没ㄊ裁磿r(shí)間,就能立刻明白這種組織業(yè)務(wù)邏輯的方式。每當(dāng)來(lái)了一個(gè)新的需求的時(shí)候,要做的事情就是去加上一個(gè)或者一些新的方法來(lái)是實(shí)現(xiàn)這個(gè)需求,而其還不會(huì)影響其他已經(jīng)存在的功能。
對(duì)于一個(gè)很小的或者基本山?jīng)]什么業(yè)務(wù)邏輯的系統(tǒng)來(lái)說(shuō),用Transaction Script模式組織業(yè)務(wù)邏輯還是很不錯(cuò)的,而且對(duì)一個(gè)剛剛踏入IT的開(kāi)發(fā)人員門(mén)檻也比較低。:當(dāng)系統(tǒng)開(kāi)始變大,業(yè)務(wù)邏輯開(kāi)始變得復(fù)雜的時(shí)候Transaction Script的問(wèn)題的出來(lái)了。最后的結(jié)果可能就是系統(tǒng)中存在大量的方法,而且這些方法中到處都是重復(fù)的代碼。有的時(shí)候,我們可以提煉出一些業(yè)務(wù)邏輯的驗(yàn)證代碼組織為方法,但是我們?nèi)ズ茈y提煉出一些在流程上相識(shí)的代碼,即使兩個(gè)流程只有一點(diǎn)點(diǎn)的不同。如果系統(tǒng)的需求稍微一邊,導(dǎo)致流程變了一點(diǎn)點(diǎn),那么很多的方法就要改動(dòng),而且我們還得在系統(tǒng)中去找出那些相似的流程代碼,然后修改,萬(wàn)一哪個(gè)方法沒(méi)有找出,后果可想而知。
下面我們就用一個(gè)人事請(qǐng)假管理系統(tǒng)為例子來(lái)看看Transaction Script是如何實(shí)現(xiàn)的。因?yàn)門(mén)ransaction Script很簡(jiǎn)單,所以下面的代碼也只是用于演示,大家理解就行了。
public class HolidayService
{
public static bool BookHolidayFor(int employeeId, DateTime From, DateTime To)
{
bool booked = false;
TimeSpan numberOfDaysRequestedForHoliday = To - From;
if (numberOfDaysRequestedForHoliday.Days > 0)
{
if (RequestHolidayDoesNotClashWithExistingHoliday(employeeId, From, To))
{
int holidayAvailable = GetHolidayRemainingFor(employeeId);
if (holidayAvailable >= numberOfDaysRequestedForHoliday.Days)
{
SubmitHolidayBookingFor(employeeId, From, To);
booked = true;
}
}
}
return booked;
}
private static int GetHolidayRemainingFor(int employeeId)
{
// ...
}
public static List<EmployeeDTO> GetAllEmployeesOnLeaveBetween(
DateTime From, DateTime To)
{
// ...
}
public static List<EmployeeDTO> GetAllEmployeesWithHolidayRemaining()
{
// ...
}
}
NET技術(shù):走向ASP.NET架構(gòu)設(shè)計(jì)——第四章:業(yè)務(wù)層分層架構(gòu)(前篇),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。