【问题标题】:Use data annonations in ASP.NET MVC using DDD使用 DDD 在 ASP.NET MVC 中使用数据注释
【发布时间】:2012-09-17 01:44:42
【问题描述】:

我已经开始使用实体框架开发 ASP.NET MVC 应用程序,我希望使用 DDD。这是我第一次在 ASP.NET 中使用 DDD(直到现在在 PHP 中使用),所以我有点困惑。 我使用的是代码优先的方法,所以我在核心中创建我的实体,然后在基础设施中创建 DbContext。

我的问题是关于数据注释的:可以对核心中的实体进行注释吗?使用Required、DataType 等,或者我必须使用纯C# 验证(在setter 和getter 中)创建条目,然后为数据库创建创建映射对象?

例如,我得到了:

public class Account
{
    public string AccountName { get; set; }
}

我可以用 [Required] 对 AccountName 进行注释吗,或者我需要创建一个映射类,它只反映 Account 类中完全相同的属性,但具有属性,这将是我将在 Entity Framework 中使用的类数据库上下文?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    都没有。

    您的实体应该几乎没有任何公共 getter 或 setter。领域模型是行为模型,而不是数据模型。您的实体应该具有更改实体状态的私有字段和方法。这些方法应该具有商业意义并且应该保护实体不变量(验证输入)。例如 - 我们有 UserAddress 并想要更改它。只是user.Address = newAddress吗?不。改变它有什么意义?也许您的用户想要FixMistypedAddress(str)。或者你的UserMoved(newLocation)?不同的业务规则可能适用于这些场景。例如,当 UserMoved() 我们想给他送香槟瓶时,而不是在他刚刚修正了一个错字的时候。您应该已经看到这里没有使用数据注释,因为我们不只是设置属性,而是进行有意义的操作。

    实体应始终有效。这意味着应该没有办法将其置于无效状态。数据注释只允许您检查对象是否有效。他们不保证始终有效。

    IMO 数据注释适用于:

    1. 在 CRUD 应用程序中使用实体框架(未应用 DDD)
    2. 在 DTO 或 ViewModel 中。换句话说 - 用于验证用户表单,而不是实体。

    所以你的第一个问题是:你是在做 CRUD 还是 DDD?

    【讨论】:

      【解决方案2】:

      我会说任何一种方式都可以。

      如果您想要更纯粹的方法,您可以创建一个包含元数据的buddy class,但也可以将其直接放在域类中。

      归根结底,这取决于您想保持多少“纯洁”,以及您想为维护伙伴班付出多少额外的工作,并不是说这是一件坏事。

      【讨论】:

        猜你喜欢
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        相关资源
        最近更新 更多