如何将数据传递给n层应用程序中的图层?我已经绘制出3种不同的方法。
A) 泛型.net对象通用数据表,Hashtables,通用数据集,字符串,整数等... 然后使用数据集来填充发送到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) 使用DataAccess层中定义的数据传输对象(仅限于conatiner对象)。然后使用这些对象来填充发送到UI层的业务对象。
alt text http://img43.imageshack.us/img43/1236/transferp.png
http://dabbleboard.com/draw?b=eiu165&i=27&c=f886efa3f9d5eb4b45ddb02361c79cdcdaec0a9b
Pro - 业务层不必使用泛型类 Con - 使用两种类型的对象,您必须使用传输对象来保存业务对象
我们在工作中进行了讨论,并希望了解社区的想法。我还添加了一个指向dabbleboard的链接。请复制并创建而不是编辑 感谢
答案 0 :(得分:5)
如果您正在使用分层方法,意味着所有图层(基本上)都在同一个进程空间中执行,因此没有编组/序列化,我会选择方法B.创建一个单独的模块,用于您的实体的所有方面所依赖的实体,并与之相结合。
但是,如果你正在使用分层方法,正如你的标题所暗示的那样,意味着存在跨越的流程和/或网络边界,我建议你采用方法C. “你并没有真正传递实例,而是传递副本,所以你在耦合到同一个对象时获得的任何好处,比如MVC方法的可观察选项,都会丢失。最好在每个层级定义数据API,而不是尝试使用相同的类。
答案 1 :(得分:1)
很好的问题 - 一如既往,答案必须是“它取决于”。
关于应用程序的类型,是否确实需要拥有业务对象(实体),而不是传输对象(即与数据库实体更相应的虚拟业务对象)。
传统上,我认为您总是需要通用数据集(或数据表),纯粹出于性能原因。每当需要使用,显示或操作较大的集合时,传统的严格OO实例化大量业务对象的方式都失败了。
但是,自从我开始使用Linq to SQL之后,我的范例发生了变化。根本不再需要这个,因为Linq模型可以是一切 - 业务对象,传输对象和通用数据集。我还没有探究它在大型应用程序中的工作情况,以及是否需要将前端代码与Linq模型隔离开来。我和同事们讨论过这个问题,但没有真正找到答案。
答案 2 :(得分:0)
我喜欢选项C,但它也让我暂停了两个原因:
答案 3 :(得分:0)
我假设同一个应用程序中存在所有3个图层。在java atleast中,我使用Hibernate进行数据访问,并在所有层中使用这些数据bean。 (选项B)能够在图层中重复使用实体是有意义的。