【问题标题】:How to bind rich Domain Model with ASP.Net MVC如何将富域模型与 ASP.Net MVC 绑定
【发布时间】:2016-08-24 04:22:18
【问题描述】:

我正在尝试使用 DDD 启动并运行,在我的案例 ASP.Net 中,技术堆栈似乎存在一些限制,这让您思考事情将如何协同工作。例如,假设我创建了一个丰富的 ShoppingCart 类,而我的 ShoppingCart 有两个方法 AddItem(String Sku)RemoveItem (字符串 Sku)。现在我可能在这两种方法中有很多逻辑,并有很多业务规则验证。

当我想使用 ASP.Net MVC 将我的 ShoppingCart 绑定到 UI 时会发生什么?理想情况下,当用户在 UI 上添加或删除项目时,我想调用 AddItemRemoveItem 方法,以便我可以验证所有规则,但通常我们绑定UI 到视图模型(POCO 类)。因此,当用户从 UI 中保存购物车时,我将获得一个 POCO 类的列表,我现在需要将其映射到我的实际业务对象。我应该遍历每个项目并从现有数据中跟踪它并现在调用 AddItemRemoveItem 方法吗?

在这种情况下,我需要在内存中为该用户保留我的域对象的一个​​实例,以便我可以对其执行操作。即使这样,我也会在控制器中有大量逻辑来决定在业务对象上调用哪些方法。

我对这些行的思考越多,它就越令人困惑,因为问题不会发生在比如说 Winforms 上,您可以轻松地从各种事件中调用 Domain 对象上的相应方法。

为了让 DDD 能够正常工作,我在整个过程中遗漏了什么?

【问题讨论】:

  • 即使在 Winforms 中,您的域实体也不会永远存在于内存中。它们会在需要时从数据库中加载,希望在某个时候它们会被持久化并被垃圾收集。

标签: c# asp.net asp.net-mvc domain-driven-design


【解决方案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.
    }
}

这个想法是您不会将丰富的域模型来回传递给视图。您传递的类是您正在使用的视图和请求的模型。对于每个请求,您将从存储库/数据存储(即示例中的购物车和项目字段)获取域模型实例。请求数据只需要指定要获取的领域模型实例的标识符即可。

【讨论】:

  • 是的,我理解这部分内容,但要实现这一点,我必须在内存中或视图状态或会话中包含原始富域模型,以执行这些操作,这对我来说似乎是过度杀戮。这正是我的问题,这是使用 DDD 和 ASP.Net MVC 做事的正确方式吗?
  • 您会在每次请求时从数据存储/存储库中获取购物车和商品。这就是 carts.GetCart(request.CartId) 调用说明的内容。
  • 谢谢!你的回答消除了我的困惑。
  • 富域模型也是 POCO。查看 SO 问题的答案'POCO' definitionPOCO vs DTO
  • @ilyapalkin 你说的很对。我更新了我的答案,因此它不引用术语 POCO 以避免混淆。
猜你喜欢
  • 2014-01-19
  • 2012-11-13
  • 2015-07-17
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多