C# 域和实体模型及其验证和复杂性开销

C# 域和实体模型及其验证和复杂性开销,c#,asp.net-mvc-5,entity-framework-6,domain-driven-design,C#,Asp.net Mvc 5,Entity Framework 6,Domain Driven Design,我正在设计一个项目,但在这种情况下,我不知道如何正确地实现DDD模式。我使用的是MVC5和EF6 我理解实体模型和领域模型之间的区别,但是每当我停下来考虑DDD体系结构在我的项目中的适用性时,我就不能动摇我所做的事情没有什么意义,因为我的领域模型总是(或99.99%的时间)最终成为实体的简单克隆。 我决定将系统分为两个项目:Application.Domain和Application.WebUI 在我的Application.Domain中,我定义了我的实体和所有持久性逻辑 我有一个定义如下的用

我正在设计一个项目,但在这种情况下,我不知道如何正确地实现DDD模式。我使用的是MVC5和EF6

我理解实体模型和领域模型之间的区别,但是每当我停下来考虑DDD体系结构在我的项目中的适用性时,我就不能动摇我所做的事情没有什么意义,因为我的领域模型总是(或99.99%的时间)最终成为实体的简单克隆。 我决定将系统分为两个项目:Application.Domain和Application.WebUI

在我的Application.Domain中,我定义了我的实体和所有持久性逻辑

我有一个定义如下的用户实体(为了简洁起见省略了一些字段)

我在一个单独的文件中使用EF Fluent API进行实体配置。以下是摘录:

ToTable("Users");
HasKey(p => p.Id);

Property(p => p.Email)
    .HasMaxLength(150)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName,
    new IndexAnnotation(new IndexAttribute("IX_Email")));
现在在Application.WebUI项目中,我将拥有我的域模型,它将“表示”实体模型

正如我之前所说的,用户的域模型将100%等于实体模型(除了我将用于验证用户输入的验证属性),因为我需要所有属性,并且视图模型看起来与域模型完全相同。 将视图模型映射到域模型,然后将其映射到实体模型,这样做感觉是不对的

此外,如果我需要将电子邮件的最大长度更改为150以外的长度,我必须在域模型验证的配置文件中更改它

感觉上我将面临大量无用的映射开销和重复验证。那么,我错过了什么

感觉上我将面临大量无用的映射开销和重复验证。那么,我错过了什么

您可能缺少的主要内容是域模型和持久化模型以不同的节奏变化。今天的模型应该继续适用于去年的数据

您应该能够积极地更改域模型(考虑“连续部署”),但您可能不希望每次部署新版本时都迁移数据库模式

对于加载和存储最有效的数据结构可能不是最适合由域模型进行内存中操作的数据结构

您可能还忽略了一个事实,即尽管持久化模型和域模型在逻辑上是分离的,但您今天不必对它们进行不同的处理。我们完全有理由注意到:(a)这两种表示现在看起来是一样的,(b)现在将它们视为一样意味着当前的发布周期更快,(c)如果项目成功,并且如果我们需要分离不同的逻辑表示,未来我们将比现在更了解如何分离它们,因此雅格尼


一定要按照您当时对力的理解,对其进行修改,以便在环境发生变化时,您可以跟踪这些力。

如果域模型直接映射到实体模型,那么您是否需要实体模型?你能把ORM映射到域模型吗?我不是建议你这么做,只是问问而已。你的“域”模型的目的是什么?你是如何使用它的,为什么你认为你需要它?@victor为什么只有两个项目,为什么域模型会在UI层?我看不出直接映射到数据库表的数据访问层实体与映射到DAL实体的域模型有什么不同。然而,我可以看到MVC应用层中映射到一个或多个域模型的视图模型与域模型之间的差异。你有一个例子吗?
ToTable("Users");
HasKey(p => p.Id);

Property(p => p.Email)
    .HasMaxLength(150)
    .HasColumnAnnotation(IndexAnnotation.AnnotationName,
    new IndexAnnotation(new IndexAttribute("IX_Email")));