2011-01-08 100 views
1

我们有一个典型的多层/层结构。应用程序+ WCF服务+存储库/ EF4 /数据库。跨层/层处理对象图的最佳方法是什么?

我们正在使用定制版本的EF POCO T4模板来生成我们的实体,我们使用跨层/层。由于涉及额外的时间/工作,我们决定不使用DTO。

一个示例对象可能是一个森林,它可能具有可能具有树叶导航属性的树的导航属性。

什么是最好的方法来添加叶子和处理对象图?数据是从客户端导入的,所以我们不一定知道数据库中是否存在父林/树。

  1. 查询服务,并获取任何现有的相关对象。为相关对象附上图形或创建新对象并在客户端附上图形。 例如:公共森林GetForest(字符串forestid) 然后---公共无效AddLeaf(叶叶)

  2. 创建森林,树,和叶在客户端对象和附加图表。发送叶对象然后在服务器端执行逻辑以将对象与数据库中的现有对象进行比较。根据需要剥离图形,添加不存在的项目和/或附加到现有对象。 示例:public void AddLeaf(叶子叶)

  3. 在客户端创建林,树和叶对象,但不附加图形。将对象发送到服务端,然后执行逻辑以将对象与数据库中的现有对象进行比较。添加不存在的项目和/或附加到现有对象。 例如:公共无效AddLeaf(叶叶子,树树,森林林)

问题归结为逻辑应该在哪里发生附上这些相关对象的图形。 在一个侧面说明中,当处理被序列化和反序列化的图时,我有点担心导航属性的“修正”逻辑。看起来这可能会成为一个昂贵的运营。

注意:客户端应用程序是一个正在导入数据的Windows服务...因此它不一定是轻量级客户端。 (我们不一定害怕增加逻辑。)

+0

使用DTO的:通过层间的对象图有时似乎是个好主意,但它会导致头痛! – 2011-01-08 06:18:08

+0

我认为我们对我们的架构下一个改造,我们将结合的DTO,而是寻找一种方式,在一定程度上自动执行像automapper。 – 2011-01-09 01:19:45

回答

1

我几个月前有类似的question。在玩了很多这个问题之后,我最后的决定是使用你的第三个解决方案(我的客户永远是Web应用程序)。这个解决方案需要编写大量的代码,并且它包含一些额外的数据库查询,因为每次您想更新对象时,都必须首先加载整个对象图。原因是,在使用分离对象时,您必须处理change tracking manually

当您使用第三种解决方案时,您也可以使用DTO并仅在客户端和服务器之间传输真正需要的数据。

如果有状态客户端(使用.NET或Silverlight编写的Windows应用程序),也可以使用自我跟踪实体和第一种方法。自我跟踪实体是Changeset模式的实现。他们可以跟踪从上下文分离后的所有更改,但必须先从DB加载实体。对于非.NET客户端使用的Web应用程序客户端或服务,自追踪实体为not a good choice

相关问题