以下是故事:网站(感兴趣的物理位置)有零个或多个联系人。这些联系人是与公司有关的人员,他们有权处理与本网站有关的事宜。
架构如下:
Person -< CompanyContact -< CompanySiteContact >- Site
||
| -< PersonPhone
|
-< PersonAddress
我的切入点是网站。我需要联系人列表。在你到达Person之前,很少有人感兴趣的野外数据。所以,我想将Person,CompanyContact和CompanySiteContact折叠成一个域类。
我提出的选项:
创建一个域类并使用FluentNH映射中的连接在检索数据时展平图层 。它从来没有听起来简单,我遇到了多级连接的问题(如果A连接B加入C,则无法在连接中指定连接到B的连接)。但是,我认为,如果可以指定连接,那只是一次性的事情,因此最终将成为最易维护的解决方案。
在一组“DTO”中复制深度模型,这些“DTO”将1:1映射到表中,并且可以传递给“平面”域模型的构造函数。它有效,但感觉就像作弊一样(没有任何问题无法通过另一层抽象来解决,除了有太多的抽象层),而我的直觉告诉我,这会以某种方式最终导致比解决的更多问题。 / p>
使用架构复制域模型1:1,并使用CompanySiteContact上的传递属性访问Person记录深度中的属性。同样,现在工作,但它并没有真正解决问题,并且每个感兴趣的新属性都需要更改映射,实际域类和顶级域类。不是很透明。
所以,Q是,我将如何构建映射?就像我说的,我无法在连接中指定连接。我认为我必须这样做的方法是映射每个表的PK,并在顶层的下一个连接中使用它,但我不确定如何设置它(没有使用FluentNH设置任何接近这个复杂的事情之前)。
答案 0 :(得分:2)
我建议您创建域模型以与您的数据库紧密匹配。从那里我创建了DTO并使用AutoMapper进行展平。容易。
答案 1 :(得分:0)
感谢詹姆斯的回答; +1,但我不认为AutoMapper在这个时刻是必要的,而且我有点不安地包含一些能够“自动”完成工作的东西。我想到了更多的选择:
在数据库中设置视图。这将起作用,因为由于业务规则,联系信息是只读的;我正在开发的应用程序必须永远不要直接更新联系人,因为不同的部门会维护此rolodex。
按照James的建议,将我的域名1:1映射,但然后使用Linq查询将模型展平为DTO。此查询可以封装在Repository的帮助程序中,允许开发人员使用Repository上的相同方法直接查询DTO,而不是其他类。它比具有相同结果的视图更复杂,但它不需要更改架构。
我可能会选择第一个选项,并在必要时使用第二个选项。