【发布时间】:2012-01-26 08:27:43
【问题描述】:
我需要通过 WCF 服务将信息从 BL 层传递到表示层。
我想通过 DataSets 来做,但我看到人们说这是一种不好的做法,建议使用数据类。
谁能解释一下区别和优势。
感谢您的帮助。
【问题讨论】:
标签: c# .net wcf wcf-data-services
我需要通过 WCF 服务将信息从 BL 层传递到表示层。
我想通过 DataSets 来做,但我看到人们说这是一种不好的做法,建议使用数据类。
谁能解释一下区别和优势。
感谢您的帮助。
【问题讨论】:
标签: c# .net wcf wcf-data-services
DataSet 是一种老式的、过时的类似 OR/M 解决方案,在拖放开发中长期运行良好。
一旦您想使用 WCF 或任何其他框架在服务上公开一些逻辑,您需要考虑到这些不应传输无用的数据,而只是客户端需要使用的数据,并且客户端可以是 用户界面或只是另一个服务或后端引擎。
在像 WCF 这样的服务中,最好的方法是 DTO(data-transfer objects,也称为 value objects),这是一个轻量级的- 业务对象的重量版本,与任何层完全不链接(它不依赖于业务、UI、数据......),可以轻松序列化为 XML 或 JSON 并在任何平台上反序列化,不仅在强类型环境中,但也有解释的、动态类型的,如 JavaScript、PHP、Python 或 Ruby(或许多其他)。
将 DTO 视为一个类,它具有某些消费者需要与您的服务层一起使用的确切数量的属性。
实际示例: 你有一个 Person 类,它有一个 Name、SecondName 和 Age。在您的用户界面中,您需要查询一些服务以获取 Person 列表,并且您只需要显示 SecondName。在这种情况下,您将设计一个具有单个属性 SecondName 的类,并且您将避免通过服务层向用户界面提供完整的 Person,因为它更便宜,而且显然是最优的。
如果此服务层返回 PersonDto 对象,则 3 人的 JSON 序列化列表将为 [{ "SecondName": "Blah" }, { "SecondName": "Bleh" }, { "SecondName": "Blih" }]。我不认为 DataSet 会是那么轻松的序列化。
查看这些关于DTO的文章:
【讨论】:
我在博客上写过这个here
【讨论】:
尝试一下 - WCF 服务应该独立于平台,而 DataSet 则不是。您不使用 DataSet 传输定义的文档,而是传输 .NET 特定对象的内部表示。
尝试一下 - DataSet 有很多糟糕的功能需要以 XML 形式表示(更改信息等),但这与设计合理的 API(Web 服务就是)完全无关。
尝试一下 - 在过去 10 年中,我所知道的任何项目都没有我认为是初级的人在任何地方都有数据集,无论 WCF 与否。大多数有知识的人在很多年前就转向了 OR 映射器。
【讨论】:
使用无类型数据集,您无法真正塑造您传递给客户端的数据,包括您的表示层。对于内部 api,这不是什么大问题,但是如果您计划扩展您的 api 使用,您应该考虑使用静态类型模型而不是广泛的数据容器的好处。这对输入和输出都很重要。使用类型化模型,您可以更好地定义数据的预期形状及其行为,并且使用共享合同,您可以利用共享验证模型。
【讨论】: