DDD / MVC Pure POCO类可以直接呈现给View吗?

时间:2013-02-01 23:21:30

标签: asp.net-mvc entity-framework architecture domain-driven-design dto

DDD / MVC描述了保持damain实体和View层分离,以保持Views persistance无知,反之亦然。 DTO是这样做的一种方式。我看过AutoMapper是一种方便他的方法。然而,由于我最近开始使用EF和纯POCO类,在我看来,直接映射persistan无知POCO的DTO实际上只是一个复制层,除了可以说你是使用DTO。如果您的POCO纯粹且持久无知,只是简单地跳过DTO层会有什么问题?

由于

JAMES

2 个答案:

答案 0 :(得分:1)

您必须记住的一件事是模型绑定器。它将绑定任何已发布的字段,表明您的模型具有相同名称的属性。

为了澄清这个问题,假设您使用的是这样的用户模型:

public class User
{
    public int UserId { get; set; }
    public string login {get; set; }
    ...
    public bool admin { get; set; }
}

如果您在注册页面上使用此模型,即使您尚未为admin和setted scaffold创建一个字段为false,恶意用户也可以创建一个名为admin的表单字段并将其设置为true(如复选框)。发布此表单将导致您收到的模型将此属性设置为true,从而使用户成为管理员。

这就是为什么你必须使用反伪造令牌,并在这种情况下查看模型来缓解工作。

答案 1 :(得分:0)

拥有DTO(或ViewModels)的原因是域对象与视图不同。

对于每个视图,您应该有一个适合它的单独ViewModel。我只能包含数据和元数据,例如验证属性。

域对象不应公开数据,而应显示代表业务规则的行为。

如果您的视图模型只是复制域模型。如果您的域模型没有任何方法,只有公共属性。如果你还没有定义无处不在的语言,聚合,不变量...那么你只是不做DDD而是CRUD app。事实上,在这种情况下,DTO可能毫无意义。