我的解决方案使用Entity Framework,我将EF模型转换为DTO对象,以便从UI层上下传递。
但我有一个设计问题:我有一个Person表和一个PersonUnavailibility
表。一个人可以有一段时间不可用。
我的PersonDTO
对象具有PersonEF模型的所有属性,以及List<PersonUnavailibilityDTO>
个对象。所以,当我找到我的人时,我也会得到不可用的人。
但是,我的PersonUnavailibilityDTO
应该有一个PersonDTO
对象吗?所以如果我得到一个PersonUnavailibilityDTO
对象,我可以看到它与哪个人相关?
如果是这样,我会得到一份循环引用。我的PersonUnavailibilityDTO's
Person属性有一个列表,列出了所有PersonUnavailibility行...并且每个行都有一个PersonDTO
,每个行都有....等等。
这类东西的最佳设计是什么?只包含与父对象相关的子对象?
也就是说,只有PersonDTO
的列表中包含PersonUnavailibilityDTOs
,但PersonUnavailibilityDTO
没有PersonDTO
?
答案 0 :(得分:2)
取决于。
在大多数情况下,由于您将从人物视图中查看dto,因此不需要它,并且始终通过此人访问不可用性。
但是当您访问对象时,相反的方法是将此人添加到不可用状态。
尽量让你的Dto尽可能小巧简约。
答案 1 :(得分:0)
一种可能的方法是使用通用复合dto模型来承载所有可能的实体组合。
http://netpl.blogspot.com/2010/12/generic-dto-model-and-other-silverlight.html
以失去严格结构的代价,你得到一个可重复使用的结构。
答案 2 :(得分:0)
作为一般建议,最好避免对象之间的双向关系。
风险是让对象不同步,即对象A指向B(或B的集合)但B不指向A - 通常,它将具有空引用。为了防止这种情况发生,你总是必须保持关系的两端同步,这是有代价的。
然而,当对象是不可变的时(这可能是你的DTO的情况),这一点得到了缓解,因为它们是在创建时组合的,之后从未修改过,从而消除了它们之间出现差异的风险。
正如Jeroen指出的那样,我仍然建议寻求最简单的解决方案:PersonDTO -> PersonUnavailibilityDTO
,直到明确证明你需要相反的关系。
答案 3 :(得分:0)
我更喜欢从DTO中删除集合并添加服务方法来代替请求集合:
function GetUnavailable(PersonID, Options) as IEnumerable(of PersonUnavailabilityDTO)
这样
没有循环引用
DTO往往重量轻
可以使用额外的过滤器,直接在数据库中应用的排序或分页来整齐地指定实际的集合