问题 为什么不使用WCF数据服务来查询数据?


好的,我们正在使用实体框架,并希望将这些实体的数据暴露给消费者。这些数据非常常见,虽然最初仅由WPF应用程序使用,但未来可能会被其他技术(如Silverlight,ASP.NET,Office等)使用。

通常,您将构建WCF服务,该服务公开了许多显式方法,以根据消费者的需求返回数据。例如,GetCustomersById(int Id),GetAllCustomers()等。如果您将来需要添加其他方法,这将导致必须重写WCF服务并处理版本问题的开销。您还可以使用DTO返回数据。

因此,我们正在考虑简单地通过WCF数据服务公开实体。这似乎有道理。它通过消除必须构建实现各种接口的显式服务来节省开发工作。它 可以 如果发生对实体的修改,还可以保护您不必重写这些接口。

这一切似乎很容易,我相信我们错过了一些东西。这种方法有哪些缺点?此外,如果我们返回实体而不是DTO,我们还会失去什么?

然后有关于您可能还有的更新和删除操作的明显问题。是否值得为这些操作考虑WCF数据服务?

感谢您的任何见解!


8686
2017-09-14 14:43


起源

乔恩怎么了?怎么样?我即将使用WCF服务设计大型项目,我吓坏了!两年后你的经历如何? - Reza Owliaei


答案:


我个人更喜欢你的初始方法,但这是因为我希望能够强有力地控制查询以及我的应用程序使用的进程。我发现当我处理大型项目时,对完全控制执行的查询等有帮助。


5
2017-09-14 15:03



感谢Mitchel的回应。除了个人控制方面,您是否可以从架构或技术角度考虑任何会引起对使用WCF数据服务的担忧?在更新和删除时,我可以想到一些事情,例如在何处以及如何实现与它们相关的业务逻辑,但在查询数据时我没有看到真正的问题。事实上,我看到了很多优点。我正在考虑拆分这两个,并且几乎就像CQRS一样。 - Jon Archway
好吧,我看到的最大的恐惧/风险是“返回的数据量”。我通常使用大型数据集,我需要保证查询不会意外返回100万条记录或类似的坚果 - Mitchel Sellers
从我所看到的,您可以使用DataServiceConfiguration.SetEntitySetPageSize属性来定义要返回的最大页面大小。我猜你所拥有的紧张感(我也有)会有效地将数据访问层暴露在链中。通常,我的显式服务方法保护数据访问层。但是,如果通过WCF数据服务公开,那么这不是那么明显,我想你可以通过配置进行控制。 - Jon Archway


我认为您有一个有效的数据服务案例。它们旨在以最适合标准的格式向最终用户公开数据。


话虽如此,反对......

缺点是你基本上给他们免费的统治来查询他们想要的数据。因此,他们可以做愚蠢的事情,并为其他用户造成瓶颈。想想编写一个结合内存和数据库操作的错误LINQ查询是多么容易。

另外,反对使用数据服务和使用传统服务的论点是,当你有很多业务逻辑,或者你想传递实体模型之外的数据类型时(你可以在4.0中做到这一点但很痛苦)。

最后,在使用数据服务进行插入/删除时,我总是感到不舒服,因为您需要最终用户对数据的存储方式有很多了解。你必须相信他们,而且我已经知道,信任通常会回来伤害你。

总而言之,当您不必向最终用户(业务逻辑或管理)强制执行大量“规则”时,数据服务非常棒。


5
2017-10-14 20:42



当你说“给予他们自由的统治”时,除了你将特定数据暴露给像Excel这样的东西之外,消费者通常是编写客户端应用程序(或可能是商业服务)的开发人员。所以,尽管我是一个控制狂,但我还是要相信他们:-)我想业务规则肯定是我脑子里想的。您可以在真正需要此类功能的特定情况下创建业务流程服务吗? - Jon Archway
当我说自由统治时,它会自由地统治你的数据,但是他们选择这样做。因此,如果他们决定进行真正糟糕的查询,那么其他用户可能会受到影响。 - Nix
我同意,但如果“最终用户”是开发人员对接口进行编程,那么无论他们是针对数据服务编写还是ef,他们都可以做到这一点。 - Jon Archway
针对什么界面编程?您提供的服务界面?如果您提供服务,则可以控制用户与数据库的交互方式。是的,他们可以管你DOS并点击你的服务1000次,但给用户一个客户端查询框架到你的数据库有自己的潜在问题,这是完全无法控制的。 - Nix
好的,但是如果相同的开发人员同时在客户端和服务上工作,那么危险也就不同了。我可以看到客户是否由一个单独的团队开发,那么这将是不同的。谢谢。 - Jon Archway


就个人而言,我认为你最初的做法是愚蠢的。那很简单。

  • 数据服务允许用户根据需要过滤和查询相关数据。
  • 数据服务已经具备完整的工具集成 - 编程语言(LINQ传递),Reporting Services,Excel可以对付它们。

在一天结束时,您将展示更多可用API,同时减少维护工作和工具支持。


1
2017-10-08 08:25



感谢坦率的回复:-)我认为我正在寻找某人对场景作出回应,因为它不是一种使用WCF数据服务的好方法,而不是推广WCF数据服务。我自己可以看到WCF数据服务的好处,但是想确保没有我错过的角度。我已经认为你可能会引入一定程度的耦合,也许会失去一些抽象。另外,当仅仅查询数据时,还有什么需要关注进行CUD操作时。再次感谢。 - Jon Archway
我认为没有一个简单的SOAP协议使用优越的场景。那很简单。 - TomTom
我不敢相信。所以你建议一个REST实现,比如OData总是优于SOAP实现?哦,我扩展这个问题不仅仅是现在查询数据。 - Jon Archway
对于数据查询,是的。它不是关于SOAP / REST - 它是关于OData是一个SEMANTICAL Web服务。对于数据检索而言,这始终比硬编码的Web服务更优越(通过ID获取客户 - 如何按名称搜索?)。此外,OData具有良好的语义,可以在一次调用中更新多个不同(!)实体(不同类型)。这可以通过SOAP完成,但大多数人从来都不打算真正做出体面的服务接口。 - TomTom
关于数据检索,OData的优势还在于它不仅是一个语义界面,而且具有公认的标准和工具支持。 - TomTom


数据服务绝对可以节省时间,但服务本身不应直接暴露给客户,而应通过其他服务。

我的方法是提供服务层:例如,您的服务实际上表现为数据层,就像您不向客户端公开数据库一样,您不直接公开数据服务,而是通过添加的服务数据的额外逻辑和价值(处理数据,控制器,业务逻辑,权限等......)。这将是典型的面向SOA的方法......

这样,如果在更改数据库模型时发现问题,则只更改公开它的服务,而不是更改所有内容。通常情况下,如果您使用某些企业服务总线,您将拥有DTO,并将对象映射到客户端可以使用的对象,从而避免了对象更改的麻烦。当然,你可以手动完成,但值得研究一下是否值得付出努力......


0
2017-10-15 08:25



如果您不打算公开您的WCF数据服务,那么使用它们有什么意义呢? - Jon Archway
我的意思是控制他们的曝光,所以不是每个人都可以使用它,而只是为数据添加一些逻辑的服务(首先保存的内容,删除某些实体时必须删除的内容,如果更新等必须满足哪些规则) ...) - veljkoz
好的,但是如果你在数据服务面前有效地拥有服务外观,为什么不在实体框架之上创建一个wcf服务而根本没有数据服务呢? - Jon Archway
想象一下,您拥有15项服务的解决方案,并且您在客户端外部提供数据。显然,您不会直接将数据服务暴露给客户端,而是通过某些中介服务。对于您的内部服务,没有必要在它之间设置一个外观,因为它是一个“家庭”服务,除了一些适当的情况(简化一些复杂的动作或类似的)。因此,数据服务按原样用于您信任/拥有的本地服务,但您不应将其作为一个完整的服务来供所有人使用... - veljkoz
啊,我明白了。是否无法锁定依赖于使用它的用户的服务?那么,内部用户是否具有完全访问权限,外部用户只能部分访问?在这种情况下,你不需要介绍一个外观? - Jon Archway