2010-09-20 57 views
1

在PRO ASP.NET MVC書:如何避免將域邏輯放入控制器?

這當然是可能把域 邏輯到控制器,即使 你不應該,只是因爲它似乎在某個瞬間高壓權宜之計 。

只是一個人爲的例子,如果應用程序不允許否定順序,將數量更改爲1的位置?如果我們按照該域的邏輯不應放置在控制器的原則,這肯定是不建議使用:

[AcceptVerbs(HttpVerbs.Post)]   
public ActionResult PlaceOrder(Order order) 
{ 
if (ModelState.IsValid) 
{ 
    order.Submit(); 
    return View("Thanks", order); 
} 
else 
{ 
    if (order.Quantity <= 0) 
    { 
     ModelState.Remove("Quantity"); 
     order.Quantity = 1; 
    } 
    return View(order); 
} 
} 

所以下面的代碼是指符合MVC原則正確的代碼,即它遵循的分離擔心,如果它是域邏輯,你不應該在控制器中看到它的代碼。所以,這就是我試圖把域邏輯型號:

public class Order : IDataErrorInfo 
{ 
public int OrderId { set; get; } 
public int ProductId { set; get; } 
public int Quantity { set; get; } 

public string Error { get { return null; } } 

public string this[string propName] 
{ 
    get 
    { 
    if (propName == "Quantity" && Quantity <= 0) 
    { 
    Quantity = 1; 
    return "0 or negative quantity not allowed, changed it to 1"; 
    } 
    else 
    return null; 

    } 
} 
} 

控制器(SAN的域邏輯):

[AcceptVerbs(HttpVerbs.Post)]   
public ActionResult PlaceOrder(Order order) 
{ 
if (ModelState.IsValid) 
{ 
    order.Submit(); 
    return View("Thanks", order); 
} 
else 
{ 
    // Response.Write(order.Quantity.ToString()); // this was changed in Model 
    return View(order); // but the View didn't reflect that fact 
} 
} 

與方法唯一的問題,模型(訂單)不能影響ModelState,並且程序總是顯示用戶最後輸入的內容。

什麼是最好的方法,所以我仍然可以避免將域邏輯放置在控制器中,View仍然能夠反映Model屬性的值?

回答

1

驗證不是控制器任務。您可以將所有必需的邏輯放在不同的模塊中,並在那裏傳播請求。

0

觀看Jimmy Bogards Put your controller's on a diet介紹。如果你喜歡你所看到的,去買他的書「MVC2 in Action

這是關於如何區分你的擔憂,所以一切都不落在控制器的行動最好的介紹。

0

啊,但業務層可以影響模型狀態。檢查this tutorial驗證與服務層。這也是存儲庫和控制反轉的一個很好的介紹。

一般的方法是爲模型狀態創建一個包裝器,該包裝器實現了一個用於向模型狀態添加錯誤的簡單接口。您的業​​務層對接口起作用 - 因此它與您的模型狀態沒有關係。你的單元測試可以實現一個僞包裝,它也實現了相同的接口。

看起來您的具體示例是將用戶的無效輸入更改爲有效輸入。我的建議是簡單地留下無效輸入並使用AddModelError來反映當控制器返回視圖時。

+0

具體的例子,除了模型是否與ModelState同步?理想情況下(因爲MVC的原則是令人鼓舞的)ModelState的更新不應該在Controller上完成 – Hao 2010-09-30 07:40:07

相關問題