2010-03-23 29 views
3

這個問題與我的ASP.NET MVC 2開發有關,但它可以應用於任何MVC環境和邏輯應該到哪裏的問題。MVC架構問題 - 付款處理在哪裏?

那麼,假設我有一個控制器需要購物車應用程序等在線支付。我有一個接受客戶的信用卡信息的方法:

public class CartController : Controller 
    CartRepository cartRepository = new CartRepository() 

    [HttpPost] 
    public ActionResult Payment(PaymentViewModel rec) 
    { 
     if(!ModelState.IsValid) 
     { 
      return View(rec); 
     } 

     // process payment here 

     return RedirectToAction("Receipt"); 
    } 

在評論process payment here應付款處理進行處理:

  1. 在控制器?
  2. 通過存儲庫?
  3. 其他地方?

回答

6

你想3.其他地方。

把它放在類庫中。創建一個包含付款處理所需的所有方法的界面。使方法通用。把具體的細節放在接口的實現中。然後從該界面派生您的付款處理服務。這給你的選項,包括測試和多付款處理器。

看看MVC店面視頻http://www.asp.net/learn/mvc-videos/。可能是視頻#23(第22部分)。自從我觀察這些以來已經有一段時間了。

+0

@ 37Stars。這些視頻很好。謝謝你指點我。 – Keltex 2010-03-23 18:46:58

1

我建議在Business Object中構建這個邏輯,然後從Controller中調用它。

例如創建一個PaymentBO類(靜態或其他方式),所以你可以調用PaymentBO.ProcessPayment(...)

1

Model要解決這個問題,因爲它是負責直接使用的部件(並保持你的數據的一致性。具體來說:

該模型是應用程序運行數據的領域特定表示。

+0

的模型只是傳遞給視圖的對象。我不認爲商業邏輯應該放在模型上。也就是說,我已經看過它一百次...... – hunter 2010-03-23 15:00:38

+1

@Hunter業務邏輯不應該在你的*視圖模型*中,但它應該在你的域模型中,如果你有一個。 – Ryan 2010-03-23 15:19:12

+0

我不同意,如果你認爲大多數模型不過是域對象反正(ASP.NET MVC類模糊兩個,這是令人沮喪的)。我儘量保持我的Domain對象(例如表示數據表的對象)和我的Model對象(可以是Domain對象或Domain對象集合或其他)儘可能乾淨,並使用BO作爲這種類型的東西... – hunter 2010-03-23 15:24:58

1

如果您使用存儲庫模式,那麼我會建議創建一個服務對象來處理任何付款,並讓您的控制器調用它。

1

這是一個建築問題。您應該爲整個系統決定實施業務邏輯的方法是否適合您的特定情況。這些方法最好在Martin Fowlers PoEAA中描述(在我看來)。主要有三種型態:

  • 交易腳本 - 具有用於處理特定事務的單獨對象的裝置
  • 活性記錄 - 具有簡單的邏輯裝置直接放置在O/RM-映射表表示對象
  • 域模型 - 指具有豐富的唯一代碼模式,即負責解決問題

要選擇主要取決於您的系統複雜程度。我描述的模式是根據它們解決複雜問題的潛力來排序的(DDD最擅長處理複雜的問題,但它本身也引入了一些「意外的」複雜性)。

1

由於已經有關於存儲庫模式的參考資料,因此您可以詳細說明域驅動設計(如Szymon所述)。

如果你這樣做,你會需要一個服務層,然後與它下面的豐富模型交談。 這裏是僞代碼

在付款控制器:

var paymentDetails = mapFromViewModel(rec) 
PaymentService.Pay(paymentDetails) 

在付款服務

void Pay (PaymentDetails paymentDetails) 
{ 
    // leverage on rich model behavior here 
    if (User.IsHaveEnoughMoney) 
    { 
    Cashier.Pay(...) 
    } 

    // more ... 

}