【问题标题】:passing data in an ntier application在 ntier 应用程序中传递数据
【发布时间】:2010-10-29 09:10:39
【问题描述】:

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

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

alt text http://img11.imageshack.us/img11/460/generic.png

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

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

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

alt text http://img8.imageshack.us/img8/6454/entities.png

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

Pro- 在所有层中使用相同的类 Con- 向所有层添加对entities.dll 的引用

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

alt text http://img43.imageshack.us/img43/1236/transferp.png

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

Pro-业务层不必使用泛型类 Con- 使用两种类型的对象,您必须使用传输对象来混合业务对象

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

【问题讨论】:

  • 我会 +1 你只是为了链接到 dabbleboard。我从来不知道。谢谢!现在...你的问题又是什么?
  • 在 dabbleboard 上同上。这很酷。
  • 是的,dabbleboard 非常适合与远程团队成员合作

标签: architecture domain-driven-design n-tier-architecture layered


【解决方案1】:

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

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

【讨论】:

  • 这是一种分层方法,所有层都在同一个进程空间中执行。在那种情况下,标题应该是什么?这是我在 n 层应用程序中传递数据的猜测?谢谢
  • 差不多。层和层之间的区别往往是模糊的,但普遍的观点是层跨越某种物理边界,通常需要编组或序列化。一个层倾向于引用一个逻辑分离并且通常不跨越那个边界。查看geekswithblogs.net/mahesh/archive/2006/10/28/95322.aspx 获取更多信息的链接。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    1. 我必须在太多地方传播有关属性的知识。
    2. DTO 必须是可序列化的,这并不可怕,但仍然需要考虑。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多