【发布时间】:2011-04-21 13:07:24
【问题描述】:
我在 MVC 中的模型设计经常遇到问题。大多数情况下,我的所有项目都需要一些要创建、编辑和删除的实体。这些实体中的大多数都有一些共同的属性,如创建日期、修改日期、作者、修改者,在某些情况下甚至更具描述性的属性是常见的。因此,我有一个单独的数据库表来存储它们。例如,文档表,我们在其中存储发票、报价单和其他业务文档。我正在为 ORM 使用 Entity Framework v4,我们最终得到了 Document 实体。
我如何修改这个实体,或者我为它创建一个单独的 DocumentViewModel 类来支持具有公共属性的多种文档类型(因此应该实现某种形式的继承或接口实现)?除了识别不同的文档类型外,我还需要一些类型来拥有不同的数据注释规则(属性)。
例如,Document 表有 PayDate 列。文档类型 Invoice 需要提供 PayDate,但文档类型 Quotation 不需要。
这是我在使用 MVC 时反复面临的一个问题,到目前为止,我每次都在处理不同的问题,但无法决定如何正确处理它以实现最大的应用程序可维护性和易于开发。
【问题讨论】:
-
请记住,您的模型不需要模仿您的数据库/表。事实上,模型的优点之一是它可以比数据库布局更接近地表示领域。仅仅因为您对数据库中的某些内容进行了规范化并不意味着它将继承自模型上的同一类。这通常是错误的方法。如果您的某些对象之间唯一的共同点是它们都有 5 个共同的属性,但规则和行为却大不相同,您可能会考虑让它们成为独立的类,而不是从同一个根继承。
-
这是一个有效的观点,Hector,但我试图在遵循最佳实践和设计简单性之间取得平衡。似乎关注点分离和 DRY(不要重复自己)这两个原则经常相互矛盾。
-
我不确定这里的任何人都可以为您提供有关如何设计域层的说明。只有对业务有充分了解的人才能做到这一点。这是你第一次做领域驱动设计吗?你过去做过OO吗?我对 Stackoverflow 的经验是,这里的小组非常擅长回答范围狭窄的问题,但对于广泛的需求来说却不是那么好。如果这是您第一次设计领域层,我会建议您从同事那里获得一些帮助或阅读有关该主题的内容。
-
我希望我不会失礼 :) 我会推荐这本书:amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/…
-
这不是我的第一次,但它是第一次使用 EF4,有些事情也依赖于此。我认为 RPM1984 我们已经走了很远,可能会接受他的回答。
标签: asp.net-mvc datamodel