如何将丰富的域模型与ASP.Net MVC绑定

时间:2016-04-29 06:26:42

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

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

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

在这种情况下,我需要在该内存中为该用户保留我的域对象的实例,以便我可以对其执行操作。即便如此,我将在控制器中拥有大量逻辑来决定在Business对象上调用哪些方法。

我在思考这些问题时越是混乱,因为问题就不会发生在让我们说Winforms上,你可以从各种事件轻松调用Domain对象上的相应方法。

在整个图片中我缺少什么才能使DDD像它一样工作?

1 个答案:

答案 0 :(得分: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.
    }
}

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