0

我的解决方案使用实体框架,我将 EF 模型转换为 DTO 对象以从 UI 层向上和向下传递。

但我有一个设计问题:我有一个 Person 表和一个PersonUnavailibility表。一个人可能有一段时间不可用。

我的PersonDTO对象具有 PersonEF 模型的所有属性以及一个List<PersonUnavailibilityDTO>对象。所以,当我得到我的人时,我也得到了人的不可用时间。

但是,我应该PersonUnavailibilityDTO有一个PersonDTO对象吗?所以如果我得到一个PersonUnavailibilityDTO对象,我可以看到它与哪个人有关?

如果是这样,我会得到一个循环引用。我的PersonUnavailibilityDTO'sPerson 属性,有一个他所有的 PersonUnavailibility 行的列表......每个行都有一个PersonDTO,每个都有一个......等等的列表。

这种事情的最佳设计是什么?只包含与父对象相关的子对象?

也就是说,只有PersonDTO有一个 列表PersonUnavailibilityDTOs,但PersonUnavailibilityDTO没有PersonDTO?

4

4 回答 4

2

这取决于。

在大多数情况下,它不是必需的,因为您将从人员视图查看 dto,并且始终通过人员访问不可用性。

但是,当您以其他方式访问您的对象时,有必要将该人员添加到不可用状态。

尽量保持你的 Dto 尽可能小和简约。

于 2013-07-02T06:18:45.753 回答
0

作为一般建议,最好避免对象之间的双向关系。

风险在于对象不同步,即对象 A 指向 B(或 B 的集合)但 B 不指向 A - 通常,它将具有空引用。为了防止这种情况发生,您必须始终保持关系的两端同步,这是有代价的。

但是,当对象是不可变的(可能是您的 DTO 的情况)时,这一点会得到缓解,因为它们是在创建时组成的,并且之后从未修改过,从而消除了它们之间差异的风险。

正如 Jeroen 指出的那样,我仍然建议采用最简单的解决方案:PersonDTO -> PersonUnavailibilityDTO直到明确证明您需要反向关系。

于 2013-07-02T09:09:32.237 回答
0

一种可能的方法是拥有一个通用的复合 dto 模型来承载所有可能的实体组合。

http://netpl.blogspot.com/2010/12/generic-dto-model-and-other-silverlight.html

以失去严格结构为代价,你得到了一个可重复使用的结构。

于 2013-07-02T07:10:22.053 回答
0

我更喜欢从 DTO 中删除集合并添加服务方法来请求集合:

function GetUnavailable(PersonID, Options) as IEnumerable(of PersonUnavailabilityDTO)

这边走

  1. 没有循环引用

  2. DTO趋于轻量化

  3. 可以通过直接在数据库中应用的附加过滤器、排序或分页来巧妙地指定实际集合

于 2016-02-06T12:51:12.573 回答