MVC + DDD - 与参数化的Domain对象构造函数进行模型绑定

时间:2015-07-13 08:54:07

标签: asp.net-mvc domain-driven-design model-binding

我有一个应用程序试图在一定程度上遵循域驱动设计。我有一个Domain层,里面的类有参数化构造函数。

我的ViewModels当然有无参数构造函数,以允许模型绑定。然而,有一页给我带来了问题。

我的一个页面显示了一个汽车列表,用户可以编辑其详细信息,然后通过JQuery POST将一辆汽车的数据发送到后端。 Car是一个Domain对象,只有一个带参数的构造函数(我在构造函数中进行业务逻辑检查)。

我后端的代码看起来像这样

[AjaxOnly]
public JsonResult Update(Car car)
{
    //...
}

当然这会失败,因为Car是一个Domain类,没有无参数构造函数。

我想知道这种情况是否有公认的最佳做法。我可以想到两个,可能有三个选择:

1)为Cars域类创建无参数构造函数。用

装饰它
[Obsolete("For model binding only")]

阻止用户直接调用它。然后在我的JsonResult方法中立即调用参数化构造函数。不幸的是,这意味着在模型中将我的私人制定者更改为公开。

2)接受FormCollection,提取值,并调用参数化构造函数。这与1)相似,但不需要对私人制定者进行任何改变。

3)也许是自定义模型绑定器?我为IoC的MVC控制器做了这个,但不知道它对非控制器有用。

有最佳实践方法来处理这个问题吗?

2 个答案:

答案 0 :(得分:2)

你的描述闻到贫血领域的模式。你的Update方法让我想到了DDD的CRUD方法。这是错的。

您的Car域模型应具有每种类型的可更新命令(例如UpdatePriceUpdateAvailability,假设您正在开发管理有界上下文)。所以你的表示层,换句话说你的ASP.NET应用程序应该有:

[AjaxOnly]
public JsonResult UpdateColor(UpdateColorViewModel vm)
{
    Car car = repository.getById(vm.id);
    try
       car.UpdateColor(vm.color);
    catch
       // return some sort of errors

    // return some sort of ok
}

答案 1 :(得分:1)

如果您没有严格来说,贫血领域模型,那么您的问题就是您的用户界面。要应用DDD,您需要task-based UI design。如果没有一个好的基于任务的UI,你就会陷入困境身体上(你的建筑),更糟糕的是,在精神上;在贫血模型中,因为您的系统不知道用户在做什么。

一旦您知道,在您的UI图层中,用户正在做什么;您可以提供从UI到域层操作的命令,您永远不必创建"创建"具有更新的属性的现有汽车的版本。只需使用执行操作所需的信息创建命令。

marianoc84(给他+1)给你一个简单而有效的例子。