仅公开来自 DBContext 的聚合根

Exposing only aggregate roots from a DBContext

我是 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; }
    }

如有任何意见,我们将不胜感激

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

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

因此,考虑到您只公开聚合根的要求,您查找学生的代码将始终需要找到 class 并从中拉出学生。

考虑应用程序中的聚合根当然很有用,但不要尝试将 DDD 概念应用于 Entity Framework class 模型。

Entity Frameworkclass 模型不是领域模型。它是一个数据访问层。任何关于包含或隐藏实体 and/or 导航属性的考虑都应该以促进流畅的数据访问为动机,仅此而已。

您不太可能总是让 read/create/update/delete 学生通过 classes。那会产生不必要的笨重代码。谁说学生永远在class?

但这也许不是聚合的最佳示例。 StudentClass 没有 身份关系 ,因为下一次他会在另一个 class 中。它与 classic Order-OrderLine 关系不同。我可以想象在那种情况下你可能只会暴露一个 DbSet<Order>.

所以只需将 DbSet<Students> 公开为 public class。