1

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

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

例如,我得到:

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

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

谢谢!

4

2 回答 2

2

两者都不。

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

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

IMO 数据注释适用于:

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

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

于 2012-09-24T12:31:01.887 回答
1

我会说任何一种方式都很好。

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

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

于 2012-09-17T01:50:19.977 回答