2016-04-29 29 views
0

我想起牀並與DDD運行,似乎有一些技術堆棧施加的限制,在我的情況ASP.Net,讓你考慮如何工作一起。例如,讓我們說,我已經創建了一個富裕階層我的購物和我我的購物的AddItem(字符串SKU)的兩種方法的removeItem(字符串SKU)。現在我可能在這兩種方法中有很多邏輯,並且有很多業務規則驗證。如何綁定豐富的域模型與ASP.Net MVC

當我想使用ASP.Net MVC將我的ShoppingCart綁定到UI時會發生什麼?理想情況下,我想調用AddItemRemoveItem方法,當用戶在UI上添加或刪除項目時,我可以驗證所有規則,但通常我們將UI綁定到視圖模型(POCO類)。因此,當用戶從UI中保存購物車時,我將獲得我現在需要映射到實際業務對象的POCO類的列表。我是否應該迭代每個項目並從現有數據中追蹤並調用AddItemRemoveItem方法?

在這種情況下,我需要在該內存中爲該用戶保留一個我的域對象的實例,以便我可以對其執行操作。即使如此,我將在控制器中擁有大量邏輯來決定在Business對象上調用哪些方法。

我越想這些行越容易混淆,因爲問題不會發生,我們可以說Winforms,在這裏你可以輕鬆地從各種事件調用Domain對象的各個方法。

我在整幅圖片中忽略了什麼使DDD像它應該那樣工作?

+0

即使在Winforms中,您的域實體也不會永遠留在內存中。當他們需要的時候,他們會從數據庫中加載,並且在某些時候他們會被堅持和垃圾收集,希望。 – guillaume31

回答

1

通常情況下,添加和刪除資源將是一個http POST調用。因此,處理此調用的控制器上的方法將收到請求的添加或刪除項目的模型。例如:

public class AddItemToCartRequest 
{ 
    public string CartId { get; set; } 
    public string ItemId { get; set; } 
} 


public class SomeController : Controller 
{ 
    // Reference to some sort of repository/data store for shopping carts 
    private Carts carts; 

    // Reference to some sort of repository/data store for store items. 
    private Items items; 

    public SomeController(Carts carts, Items items) 
    { 
     this.carts = carts; 
     this.items = items; 
    } 

    [HttpPost] 
    public ActionResult AddItem(AddItemToCartRequest request) 
    { 
     var cart = carts.GetCart(request.CartId); 
     var item = items.GetItem(request.ItemId); 

     cart.AddItem(item); 
     carts.Save(cart); 

     // Redirect to action showing the "item added" or whatever. 
    } 
} 

這個想法是,您不會將富域模型來回傳遞給視圖。您傳遞的是您正在使用的視圖和請求的模型。在每個請求中,您都可以從存儲庫/數據存儲中獲取域模型實例(即示例中的購物車和項目字段)。請求數據只需要指定要提取的域模型實例的標識符。

+0

是的,我理解這一部分,但爲了實現這一點,我將不得不在內存或視圖狀態或會話某處執行這些操作,這對我來說似乎是一個過度殺手。這正是我的問題所在,這是用DDD和ASP.Net MVC做事情的正確方法嗎? –

+1

您可以在每個請求中從數據存儲庫/存儲庫獲取購物車和物品。這是carts.GetCart(request.CartId)調用所示的內容。 – lenkan

+0

謝謝!你的回答消除了我腦海中的混亂。 –