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

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

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

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

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

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

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

怎么办?

【问题讨论】:

    标签: asp.net-mvc-4 ef-code-first domain-driven-design entity-framework-5 entities


    【解决方案1】:

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

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

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

    【讨论】:

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