8

如何将数据传递到 n 层应用程序中的层?我已经制定了 3 种不同的方法。

A) 通用 .net 对象通用数据表、哈希表、通用数据集、字符串、整数等......然后使用数据集填充发送到 UI 层的业务对象。

替代文字 http://img11.imageshack.us/img11/460/generic.png

http://dabbleboard.com/draw?b=eiu165&i=26&c=54eef6f1ac01f03c85919518f4a24e798e57e133

Pro-不需要额外的层 Con-必须使用业务层中的通用数据集和表

B) 使用其他层将引用的实体层。该层将包含强类型数据集或普通旧 C 对象。这些对象将主要是容器数据和很少的逻辑。这些将是发送到 UI 层的相同对象。

替代文字 http://img8.imageshack.us/img8/6454/entities.png

http://dabbleboard.com/draw?b=eiu165&i=6&c=d0c2b346894a96b12bd3867f630e474a2af098fa

Pro-在所有层中使用相同的类 将对 entity.dll的引用添加到所有层

C) 使用数据访问层中定义的数据传输对象(仅限容器对象)。然后使用这些对象填充发送到 UI 层的业务对象。

替代文字 http://img43.imageshack.us/img43/1236/transferp.png

http://dabbleboard.com/draw?b=eiu165&i=27&c=f886efa3f9d5eb4b45ddb02361c79cdcdaec0a9b

Pro-业务层不必使用通用类 -使用两种类型的对象,您必须将业务对象与传输对象结合起来

我们在工作中进行了讨论,想看看社区的想法。我还添加了一个指向 dabbleboard 的链接。请复制和创建而不是编辑。
谢谢

4

4 回答 4

5

如果您使用的是分层方法,这意味着所有层(基本上)都在同一进程空间中执行,因此没有编组/序列化,我会选择方法 B。为您的实体创建一个单独的模块,所有方面都基于该模块您的程序取决于,并且耦合到那。

但是,如果您使用标题所暗示的分层方法,这意味着跨越了进程和/或网络边界,我建议您使用方法 C。您并没有真正传递实例,您重新传递副本,因此耦合到同一个对象的任何好处,例如 MVC 方法的可观察选项,无论如何都会丢失。在每个层级定义数据 API 比尝试使用相同的类更好。

于 2009-05-27T19:16:35.553 回答
1

好问题 - 与往常一样,答案必须是“视情况而定”。

关于应用程序的类型,以及是否真的需要拥有业务对象(实体),而不是传输对象(即更多对应于数据库实体的简化业务对象)。

传统上,我会认为您总是需要通用数据集(或数据表),纯粹是出于性能原因。每当需要处理、显示或操作更大的集合时,实例化大量业务对象的传统严格 OO 方法就会失败。

然而,自从我开始使用 Linq to SQL 以来,我的范式发生了变化。不再需要这个,因为 Linq 模型可以是一切——业务对象、传输对象和通用数据集。我还没有探索这在真正的大型应用程序中的效果如何,以及是否需要将前端代码与 Linq 模型隔离开来。我曾与同事讨论过这个问题,但无论哪种方式都没有真正找到答案。

于 2009-05-27T19:11:37.560 回答
0

我喜欢选项 C,但它也让我暂停,原因有两个:

  1. 我必须在太多地方传播有关属性的知识。
  2. DTO 必须是可序列化的,这并不可怕,但仍然是一个考虑因素。
于 2009-05-27T19:08:09.923 回答
0

我假设所有 3 层都存在于同一个应用程序中。在 java 中,我至少使用 Hibernate 进行数据访问,并在所有层中使用了这些数据 bean。(选项 B)能够在图层中重用实体是有意义的。

于 2009-05-27T19:10:39.760 回答