我有一个数据合同说用户。它是可序列化的并且可以通过网络传输。我想要一个操作合同 SaveUser()。我可以将 SaveUser(User user) 作为运营合同保留在我的服务合同中。但是我可以把它作为自己的行为保存在我的数据合约中吗?
Save() 应该理想地保存自己。所以按照 OO 原则,每个数据合约都应该知道如何保存自己,细节应该从外部世界中抽象出来。
这在 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:客户端发生了什么。我提到你必须考虑是否每个班级' s 方法必须是 WCF 服务操作。在客户端上拥有丰富的完全封装的业务类当然是有必要的。在它们的操作不需要作为服务操作执行的地方,这些操作在客户端域中执行它们的逻辑。问题变成了如何通过服务将它们发送给客户端,这里有两种选择:a) 在客户端上实例化一个实例,并从服务操作返回的 DataContract 填充它的属性。b) 直接从服务操作返回对象,就像在 CSLA 之类的框架中所做的那样(我认为 DevForce 遵循类似的方法通过 WCF 服务返回业务类)。高温高压 不需要作为服务操作执行,这些操作在客户端域中执行它们的逻辑。问题变成了如何通过服务将它们发送给客户端,这里有两种选择:a) 在客户端上实例化一个实例,并从服务操作返回的 DataContract 填充它的属性。b) 直接从服务操作返回对象,就像在 CSLA 之类的框架中所做的那样(我认为 DevForce 遵循类似的方法通过 WCF 服务返回业务类)。高温高压 不需要作为服务操作执行,这些操作在客户端域中执行它们的逻辑。问题变成了如何通过服务将它们发送给客户端,这里有两种选择:a) 在客户端上实例化一个实例,并从服务操作返回的 DataContract 填充它的属性。b) 直接从服务操作返回对象,就像在 CSLA 之类的框架中所做的那样(我认为 DevForce 遵循类似的方法通过 WCF 服务返回业务类)。高温高压 b) 直接从服务操作返回对象,就像在 CSLA 之类的框架中所做的那样(我认为 DevForce 遵循类似的方法通过 WCF 服务返回业务类)。高温高压 b) 直接从服务操作返回对象,就像在 CSLA 之类的框架中所做的那样(我认为 DevForce 遵循类似的方法通过 WCF 服务返回业务类)。高温高压