我有一份数据合同,说是用户。它是可序列化的并且可以通过网络传输。我想要一个操作合约 SaveUser()。我可以将 SaveUser(User user) 作为操作合同保留在我的服务合同中。但我可以将其作为自己的行为保留在我的数据合约本身中吗?
理想情况下,Save() 应该保存自身。因此,根据面向对象原则,每个数据契约都应该知道如何保存自身,并且应该从外部世界抽象出细节。
这在 WCF 中可能吗?
我会说不,这是正确的。
虽然我同意您关于 OO 原则和封装的看法,但 WCF 处理的是 SO(面向服务)原则。
可以从 CD 播放器和 CD 的角度来考虑这一点。 CD 播放器就是服务。 CD 是数据合同。 OO 原则要求 CD 具有 Play 方法,以便能够自行播放。但是,播放 CD 不仅仅是了解其数据。有电子设备、输出插孔的接口等。这些都是由 CD 播放器...服务提供的。
这就是为什么您的服务合约具有 Play 方法,并接受 CD 作为数据合约,告诉它要播放什么(而不是如何播放)。
在评论中的问题后编辑:不,当然(希望)不是。最坏的情况是您将拥有 34 个服务合同,每个服务合同平均有 6 个方法。仅当您确定每个类上的每个方法都必须作为服务操作发生时,才会出现这种情况。您需要考虑两个方面。第 1 方面:您的服务设计。您应该将 34 个类分组为有意义的分组,而不是 34 个服务合同,并为每个组创建 1 个服务合同。例如,您最终可能会得到一个 InventoryManagement 服务、一个 SalesOrderProcessing 服务和一个 BackOfficeOperations 服务。这些服务中的每一个都包含与分组到其域中的类范围相关的服务操作(和数据契约)。
方面2:客户端发生了什么。我提到您必须考虑每个类的方法是否必须是 WCF 服务操作。当然有可能在客户端拥有丰富的完全封装的业务类。当它们的操作不需要作为服务操作执行时,这些操作在客户端域中执行它们的逻辑。问题变成了如何通过服务将它们发送到客户端,这里有两种选择:a) 在客户端上实例化一个实例,并从服务操作返回的 DataContract 填充它的属性。 b) 直接从服务操作返回对象,就像在 CSLA 这样的框架中所做的那样(我认为 DevForce 遵循类似的方法通过 WCF 服务返回业务类)。
华泰
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)