我如何设计具有受保护/私有成员 DDD 样式的 EF5 代码优先实体

Posted

技术标签:

【中文标题】我如何设计具有受保护/私有成员 DDD 样式的 EF5 代码优先实体【英文标题】:How do i design EF5 code first entities with protected/private members DDD style 【发布时间】:2013-04-14 03:32:03 【问题描述】:

所以我正在阅读这本 DDD 书,同时设计一个新系统。在 DDD 书中,他们有一个示例,其中实体具有私有成员,例如 ID 和其他值。

假设我们有一个用户实体,它有 id 和它有权参加的课程集合。

然后在 DDD 风格中,如果我们说在用户实体上,他们会使用 GrantRightTo(Course c) 之类的东西。 这一切都很好,因为在该功能中,我现在可以检查任何业务规则,例如用户是否注册了太多课程。聪明!

另一种选择是任何人都有权收集课程,但控制器需要知道不好的业务规则。

现在首先是 EF 代码的问题,我不能像我的书那样让我的课程集合成为私有/受保护的并且仍然被持久化 (dbcontext) 那么该怎么办呢?

我当然可以将集合公开,并且仍然有像 GrantRightTo 这样的方法,但是其他开发人员可能会以错误的方式执行此操作,因此并不理想。

怎么办?

【问题讨论】:

【参考方案1】:

做到这一点的最佳方法是将您的数据库模型与 DTO(数据传输对象)映射。

您将使用 DTO 模型创建一个额外的层。你真正的领域模型可以基于这个数据库模型。在您的领域模型中,您可以抽象出底层模型中的差异。

这也有一个缺点,即如果您的项目发生垂直变化,您需要同时维护这两个模型。但是,它还允许您的域模型独立于您的物理数据库模型进行更改。

【讨论】:

感谢您的回答。添加另一个必须维护的层听起来确实有点烦人。这是推荐的路径,还是我应该完全看一个不同的设计? 这在很大程度上取决于您的应用程序。这是一种方法,但正如我所说,有利也有弊。您应该真正查看您的特定应用程序,看看什么最适合您的情况。不幸的是,这里没有灵丹妙药 这个解决方案怎么样:blog.oneunicorn.com/2012/03/26/… 确实在实体中有一些代码是关于存储的,但理论上它仍然与存储无关。并且不需要额外的层。 这当然也是一个有效的解决方案。如果添加一个新层会增加很多复杂性,我会这样做

以上是关于我如何设计具有受保护/私有成员 DDD 样式的 EF5 代码优先实体的主要内容,如果未能解决你的问题,请参考以下文章

使用受保护和继承时无法访问在类中声明的私有成员

Python中的“受保护”访问 - 如何?

如何在私有和受保护的访问修饰符之间进行选择以封装基类和子类之间的成员?

Objective-C - 私有与受保护与公共

Python - 访问类的受保护成员_

Java通过受保护的getter访问私有超类成员