代碼
public class OrderManager { public void PlaceOrder(OrderDTO order) { // Validate order based on business rules // Check for stock availablity on items ordered // Add the order to the database // Set the order id on the OrderDTO object } public bool CancelOrder(Guid orderId) { // Retrieve order from database // Determine if the order can be canceled // if order can be canceled, set as canceled // return true/false if order was canceled } public bool AddItemToOrder(Guid orderId, OrderItemDTO ItemToAdd) { // Retrieve order from database // Determine if the item can be added to the order // Add a new item row in the database // return true/false if item was added to the order } public bool ProcessOrder(Guid orderId) { // Check to ensure this order can be processed. // Validate order based on business rules // Update the stock levels of products ordered // return true/false if order was processed } }
在上面的代碼中,所有和訂單處理有關(guān)的邏輯都寫在OrderManager類中。類中的每一個方法就對應(yīng)業(yè)務(wù)邏輯中的一個流程或者說對應(yīng)一個use case,例如:CancelOrder就是取消訂單。
通過Transaction Script的方式來組織業(yè)務(wù)邏輯,一個很好的好處就是直觀,很容易理解代碼在做什么。如果有新的流程來了,再加一個方法就行了。
同時,這種組織方式的弊端就在于,當系統(tǒng)中的業(yè)務(wù)變得多而且復(fù)雜的時候,那么這樣的方法就開始變多,最后的結(jié)果就是一個類中有成百上千個方法。而且這些方法中,除了一些基本的驗證可以提取為方法重用,其他的流程控制代碼在很多的地方要重寫,特別是當有兩個流程差不多的時候,代碼不可避免的重新寫。于是,這樣的類開始變得龐大而難以管理。
Active Record
這種組織方式已經(jīng)是我們最熟悉的了。
在很多的項目中,我們的業(yè)務(wù)實體類基本和數(shù)據(jù)庫中表是一一對應(yīng)的,例如一個Order業(yè)務(wù)類就是代表了數(shù)據(jù)庫中的Order表。而且在平時項目中,”樸實的三層(N層)”,一般都是基于這種方式在組織邏輯。
這種方式的最大的區(qū)別就是每個業(yè)務(wù)類自己負責自己的數(shù)據(jù)存取,也就是說在業(yè)務(wù)類中包含了業(yè)務(wù)邏輯的處理和數(shù)據(jù)的存取。
出處:博客園
責任編輯:bluehearts
上一頁 asp.net架構(gòu)設(shè)計解惑 [1] 下一頁 asp.net架構(gòu)設(shè)計解惑 [3]
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|