WCF多个数据合同或多个服务合同代表多个数据模型类?

时间:2009-12-12 17:11:58

标签: wpf wcf web-services design-patterns datacontract

在我的WPF应用程序数据模型中,我有多个类,表示通过WCF自托管服务与后端数据库交互的数据。

我的WCF服务中是否应该有多个数据协定或多个服务联系人或端点来表示这些多个WPF数据模型类?在这种情况下,构建WCF的正确(或可能是唯一)方法是什么?

2 个答案:

答案 0 :(得分:2)

有一个名为Interface Segragation Principle的设计建议,它基本上说明了iDesign WCF编码标准所说的内容:不要让你的接口(=你的服务合同)太大而且太笨重。

考虑一下:您与数百种方法签订了巨大的服务合同,而某些第三方希望实现一部分功能,可能只有两种或三种服务方法。如果您有一份巨额服务合同,他们将不得不实施他们感兴趣的3-4种服务方法,而所有其他服务方法,他们将不得不存根假人 - 例如像throw new NotImplementedException();之类的东西。一般来说,这不是一个好主意。

所以基本原则应该是:尝试将服务合同分组,如果其他人需要实现子集,他们很可能会找到一个具有所需方法的服务合同,而不是其他。尝试按主题对服务合同进行分组,例如如果您有6种搜索地址的方法,请将它们放在单独的服务合同中。如果您有其他7种方法来插入新地址,请更新和删除现有地址 - 这应该是一个单独的服务合同(因为您可以想象有人只想搜索地址 - 而不是修改任何地址)。

所以我猜没有真正的硬性规则什么是好的 - 尝试将您的服务分组为“逻辑连接”的方法组。这肯定不是一件容易的事!但值得努力思考其他人如何使用您的服务。

此外,如果您有一些较小的服务合同,如果您需要更改任何内容,它也会更容易。如果您需要在服务合同中引入重大更改,那么只有具有少量方法的特定服务合同的那些(希望很少)用户才会受到影响。如果你总是要改变你的庞大的200方法服务合同,你将永远影响每个人 - 这可能不是一件好事!

答案 1 :(得分:1)

在WCF术语中,数据协定是服务合同操作中使用的类。它被称为数据协定,因为它通常使用DataContractAttribute进行注释,以便成功识别和序列化(尽管从.NET 3.5 SP1 DataContractSerializer开始使用POCO对象并且不再需要此属性) 。因此,您可以拥有一个服务合同,其中包含多个操作,处理所有在单个端点中公开的数据合同。