2016-04-29 31 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

谢谢!你的回答消除了我脑海中的混乱。 –