業(yè)務(wù)組件的設(shè)計(jì)是非常重要的工作,如果你沒有正確的設(shè)計(jì)業(yè)務(wù)組件的話,結(jié)果很可能就是代碼難以維護(hù)和擴(kuò)展。在設(shè)計(jì)和實(shí)現(xiàn)應(yīng)用的時(shí)候,有多種類型的業(yè)務(wù)組件。包括業(yè)務(wù)邏輯組件,業(yè)務(wù)實(shí)體,業(yè)務(wù)流程或者是工作流組件,工具和幫助組件。
設(shè)計(jì)步驟
1 確定在應(yīng)用中將會(huì)使用的業(yè)務(wù)組件
在業(yè)務(wù)層,你需要?jiǎng)?chuàng)建和使用各種類型的組件來處理業(yè)務(wù)邏輯。本步驟的目標(biāo)就是如何識(shí)別這些組件,發(fā)現(xiàn)應(yīng)用需要的組件。下面的步驟幫助你確定你需要那些組件:
- 考慮使用業(yè)務(wù)邏輯組件來封裝業(yè)務(wù)邏輯和應(yīng)用狀態(tài)。業(yè)務(wù)邏輯是一種集中于實(shí)現(xiàn)業(yè)務(wù)規(guī)則和行為的應(yīng)用邏輯,同時(shí)包括維護(hù)全局的一致性,例如數(shù)據(jù)合法性驗(yàn)證。業(yè)務(wù)邏輯組件應(yīng)該設(shè)計(jì)成容易測(cè)試的、獨(dú)立于表現(xiàn)層和數(shù)據(jù)訪問層。
- 考慮使用業(yè)務(wù)實(shí)體作為領(lǐng)域模型的一部分,來代表真實(shí)世界的業(yè)務(wù)實(shí)體,例如產(chǎn)品和訂單。
- 如果你的應(yīng)用需要支持以一種特殊的順序進(jìn)行多進(jìn)程處理,考慮使用業(yè)務(wù)工作流組件。使用在多個(gè)業(yè)務(wù)邏輯組件之間進(jìn)行交互所需的業(yè)務(wù)規(guī)則。通過升級(jí)工作流組件就可以改變應(yīng)用的行為。如果應(yīng)用一定要實(shí)現(xiàn)根據(jù)業(yè)務(wù)規(guī)則實(shí)現(xiàn)動(dòng)態(tài)的業(yè)務(wù)邏輯的話,考慮使用工作流組件?紤]使用WF實(shí)現(xiàn)工作流組件,考慮和微軟的BizTalk Server環(huán)境整合。
2 為業(yè)務(wù)組件做關(guān)鍵的決定
web應(yīng)用中的業(yè)務(wù)組件通常處理消息為基礎(chǔ)請(qǐng)求,windows form應(yīng)用通常處理事件為基礎(chǔ)的請(qǐng)求。另外,不同類型的應(yīng)用關(guān)注點(diǎn)也不同。一些因素是不分應(yīng)用類型的,一些因素又是每個(gè)應(yīng)用類型特有的。你一定要處理的關(guān)鍵問題包括:
- 部署位置。你的業(yè)務(wù)邏輯組件是放在客戶端嗎?還是應(yīng)用服務(wù)器?還是兩者都有?如果應(yīng)用是富客戶端應(yīng)用或者是RIA,想要提高性能,使用領(lǐng)域模型設(shè)計(jì)業(yè)務(wù)實(shí)體,考慮在客戶端放一些業(yè)務(wù)組件。如果要支持多種客戶端類型,如果業(yè)務(wù)組件需要訪問客戶端訪問不到的資源,或者是安全原因,考慮將業(yè)務(wù)組件放在應(yīng)用服務(wù)器上。
- 耦合。表現(xiàn)層組件如何與業(yè)務(wù)組件交互?是應(yīng)該設(shè)計(jì)一個(gè)表現(xiàn)層直接知道業(yè)務(wù)組件的緊耦合,還是一個(gè)對(duì)表現(xiàn)層屏蔽實(shí)現(xiàn)細(xì)節(jié)的業(yè)務(wù)組件松耦合。如果你是一個(gè)富客戶端類型或者是RIA,可以考慮緊耦合表現(xiàn)層和業(yè)務(wù)組件。但是松散耦合可以提高可測(cè)試性和靈活性。如果你有一個(gè)富客戶端類型或者是RIA應(yīng)用,將業(yè)務(wù)組件部署在應(yīng)用服務(wù)器或者是web服務(wù)器,為它們之間的交互設(shè)計(jì)一個(gè)服務(wù)接口,來實(shí)現(xiàn)松散耦合。
- 交互。如果業(yè)務(wù)組件和表現(xiàn)層組件部署在同一個(gè)物理層,考慮使用通過事件和方法的組件為基礎(chǔ)的交互,來最大化性能。但是,如果表現(xiàn)層和業(yè)務(wù)層部署在不同的物理層,考慮使用服務(wù)接口和消息為基礎(chǔ)的交互方式。
3 選擇適當(dāng)?shù)氖聞?wù)支持
業(yè)務(wù)組件負(fù)責(zé)協(xié)調(diào)和管理業(yè)務(wù)層需要的事務(wù)。但是第一步是決定是否需要事務(wù)支持。事務(wù)用來確保一些的行為都可以執(zhí)行,例如數(shù)據(jù)庫事務(wù)。事務(wù)以一個(gè)單獨(dú)的單元來完成。如果單元中的一個(gè)行為失敗,其他的行為會(huì)回滾,確保系統(tǒng)的一致性狀態(tài)。例如:有一個(gè)操作需要更新三張表,如果一個(gè)失敗,兩個(gè)成功,數(shù)據(jù)庫將會(huì)處于不一致狀態(tài),這時(shí)候適合用事務(wù)來執(zhí)行,一個(gè)失敗,大家都回滾到事務(wù)之前的狀態(tài),保證了一致性。事務(wù)包括下面的一些類型:
- System.Transactions。使用業(yè)務(wù)邏輯初始化和管理事務(wù)。包括在.NET 2.0中,實(shí)現(xiàn)輕量的事務(wù)管理。
- WCF Transactions。在.NET 3.0中引入,如果和WCF service進(jìn)行交互,考慮使用WCF Transactions。
- ADO.NET Transactions。
- Database。
4 確定業(yè)務(wù)規(guī)則如何處理
業(yè)務(wù)規(guī)則的管理是應(yīng)用最有挑戰(zhàn)性的設(shè)計(jì)之一。通常業(yè)務(wù)規(guī)則用于業(yè)務(wù)層。但是,他們會(huì)在業(yè)務(wù)層的那里呢?你可以放在業(yè)務(wù)邏輯或者是工作流組件,或者是一個(gè)獨(dú)立的業(yè)務(wù)規(guī)則引擎,又或者是包含在領(lǐng)域模型設(shè)計(jì)的業(yè)務(wù)實(shí)體中。參考下面的選項(xiàng):
- 業(yè)務(wù)邏輯組件。
- 工作流組件。
- 業(yè)務(wù)規(guī)則引擎。
- 領(lǐng)域模型設(shè)計(jì)。將業(yè)務(wù)規(guī)則包括在業(yè)務(wù)實(shí)體中。
5 確定滿足需求的設(shè)計(jì)模式
設(shè)計(jì)模式 |
推薦原因 |
Adapter適配器模式 |
允許沒有兼容接口的類在一起工作,允許開發(fā)者實(shí)現(xiàn)一個(gè)多態(tài)的類為現(xiàn)有了類提供一個(gè)可替代的實(shí)現(xiàn)。 |
Command |
推薦在富客戶端應(yīng)用的菜單、工具條、鍵盤快捷鍵中使用,不同的組件執(zhí)行相同的命令。 |
Chain of Responsibility |
可以用來代替if 。。。then。。。else語句,可以處理復(fù)雜的業(yè)務(wù)規(guī)則。 |
Decorator |
通過添加和修改操作,在運(yùn)行的時(shí)候擴(kuò)展對(duì)象的行為。需要一個(gè)通用的接口,有一個(gè)Decorator類來實(shí)現(xiàn)它?梢蕴幚韽(fù)雜的業(yè)務(wù)規(guī)則。 |
Dependency Injection |
使用一個(gè)獨(dú)立的類創(chuàng)建對(duì)象和成員,通常基于配置文件在運(yùn)行的時(shí)候創(chuàng)建依賴關(guān)系。配置文件中指明類型的映射關(guān)系。提供一個(gè)修改行為的靈活方式,從而實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)規(guī)則。 |
Facade |
提供粗粒度的操作,統(tǒng)一多個(gè)業(yè)務(wù)組件的結(jié)果。典型的應(yīng)用是,在業(yè)務(wù)層為以消息為基礎(chǔ)的接口實(shí)現(xiàn)一個(gè)遠(yuǎn)程的外觀,用來在表現(xiàn)層和業(yè)務(wù)層提供一個(gè)松散的耦合。 |
Factory |
不用指定的類型創(chuàng)建對(duì)象實(shí)例,需要對(duì)象實(shí)現(xiàn)通用的接口,或者是繼承一個(gè)基類。 |
Transaction
Script |
在很少的業(yè)務(wù)規(guī)則的CRUD操作中推薦使用。 |
本文鏈接:http://www.95time.cn/tech/program/2010/7652.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|