在我们的业务逻辑中,我们有时会定义一些类似于以下内容的方法:
User.ResetCourse(Course courseToReset)
问题在于用户和课程都是实体框架代理对象。这意味着当我们在“用户”或“课程”上命中导航属性时,可能会严重打击数据库,因为这些对象不可查询,因此可以正常地遍历它们。
为了解决这个问题,我们将签名更改为:
User.ResetCourse(MyDBContext db, Course courseToReset)
这意味着我们可以直接查询数据库以有效地进行所需的更改,但是将Database上下文传递给业务对象似乎太错误了。
后来我们向用户迁移了服务层,这意味着我们拥有以下内容:
CourseService.ResetForUser(Course courseToReset, User forUser)
该服务引用了创建时注入的DBContext,但是现在我们的业务对象只是没有行为的数据包(例如,Anemic Domain Model)。
我们如何避免这种情况?