1

我的域由两个类组成。第一个是病人。二是注入。Person 可以有许多注入实例。

这引发了一些 OOD、关系数据库设计和 ORM(特别是 EntityFramework)的架构问题:

我希望 Patient 将持有 injections 属性列表,并且 Injection 将持有 Patient 属性。这看起来像是一个很好的面向对象设计。

这种设计(首先使用 EntityFramework 代码)将映射到两个表:Patients 表和 Injections 表。Injections 表将有一个外键指向患者表中的一行。

到目前为止,一切都很好。

现在,让我们假设一个如上所述的数据库案例,其中 1 名患者进行了 100,000 次注射。

当我为该患者询问 DbContext 时,它将检索患者数据,并且注射列表将仅按需求加载。

这看起来像是一个潜在的问题。我对 Patient 的任何潜在用户说 - “嘿,你有一个注射列表,使用它们!只做 - myPatient.Injections,它们会神奇地出现”。

但是,通过公开此属性,我可能会使患者用户运行非常繁重的查询,这甚至可能不是应用程序的需要。

一种可能的解决方案是从患者类中删除注射列表。关于数据库,映射将保持不变,为了查询患者的注射情况,我将使用具体服务。但是现在我有一个 Patient 类,它不能很好地代表我的领域。

另一种可能的解决方案是将 EF 上下文返回的每个对象映射到另一个浅对象。我只会映射我需要的东西,不会向用户公开不需要的数据。这种方法将导致重复和类之间映射的维护。

你怎么看这个问题?

分享你的知识:)

4

1 回答 1

1

这完全取决于您如何实际公开您的对象。

如果对象在域模型级别公开,那么是的,对注入的延迟加载查询可能会加载和实现 100k 个项目。但是,嘿,创建 10 万个实例并插入它们或做任何如此繁重的事情也可能代价高昂。

这意味着如果您担心潜在的误用,请不要将域模型暴露给潜在客户。相反,让您的服务层,甚至可能通过 http 公开,这样您就不会遇到此类问题,例如 - 大集合总是会通过分页公开。

于 2013-06-19T18:05:38.923 回答