【问题标题】:Exposing only aggregate roots from a DBContext仅从 DBContext 公开聚合根
【发布时间】:2015-07-03 17:46:38
【问题描述】:

我是 DDD 的新手。在我们的 DDD 项目中,我们有一个要求,我们的 DBContext 应该只暴露 AggregateRoots.. 假设我们的 DbContext 如下所示

public class ClassContext :  DbContext
{ 
    public DbSet<Class> Classes{ get; set; }
    public DbSet<Students> Students{ get; set; }
}

和 Class 是聚合根。以下实现方式是否正确

 public class ClassContext :  DbContext
    { 
        public DbSet<Class> Classes{ get; set; }
        private DbSet<Students> Students{ get; set; }
    }

欢迎评论

【问题讨论】:

  • 你需要阅读更多关于 DDD 和 Repository pattern 作为概念的信息,然后你才应该处理实现。如果您正在寻找一个快速的解决方案,那不是它的做法。顺便说一句,ORM 是一个 implementation detail 的 repository 。如果你不理解这个概念,代码就帮不了你。
  • @MikeSW 仅供参考,OP 甚至没有询问存储库模式。

标签: entity-framework domain-driven-design dbcontext aggregateroot


【解决方案1】:

考虑应用程序中的聚合根当然很有用,但不要尝试将 DDD 概念应用于实体框架类模型。

实体框架类模型不是领域模型。这是一个数据访问层。任何关于包含或隐藏实体和/或导航属性的考虑都应以促进数据访问顺畅为动机,仅此而已。

您不太可能总是只通过课程来阅读/创建/更新/删除学生。这会产生不必要的笨重代码。谁说学生永远在课堂上?

但这也许不是聚合的最佳示例。 StudentClass 没有识别关系,因为下次他将在另一个班级。经典的Order-OrderLine 关系会有所不同。我可以想象,在这种情况下,您可能只会暴露一个DbSet&lt;Order&gt;

所以只需将DbSet&lt;Students&gt; 公开为公共类。

【讨论】:

    【解决方案2】:

    我认为不需要学生的私人声明。 大概 Class 对象包含类似的东西

     public virtual List<Student> Students { get; set; }  
    

    因此,鉴于您只公开聚合根的要求,您查找学生的代码将始终需要找到一个班级并将学生从中拉出。

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多