一个WCF数据契约是否可以包含一个WCF操作契约?为什么?

6

我有一个数据契约叫做User,它是可序列化的并且可以在网络上传输。我想要一个操作契约SaveUser()。我可以在我的服务契约中将SaveUser(User user)作为操作契约保存。但是我能否将其保留在我的数据契约本身中作为自己的行为?

Save()应该理想地自我保存。因此按照面向对象原则,每个数据契约都应该知道如何保存自己,并且细节应该从外部世界抽象出来。

在WCF中是否可能实现这一点?

1个回答

9
我认为不应该这样做,这是正确的。 虽然我同意您关于OO原则和封装的观点,但WCF处理SO(面向服务)原则。 将其视为CD播放器和CD。 CD播放器是服务。 CD是数据合同。 OO原则要求CD具有播放方法以便能够播放自己。但是,播放CD远不止于了解它的数据。还有电子设备,输出插座的接口等。所有这些都由CD播放器提供...即服务。 这就是为什么您的服务合同具有Play方法,并接受CD作为数据合同告诉它要播放什么(而不是如何播放)的原因。

在您的评论中提出问题后进行编辑: 不,当然不会(希望如此)。最坏的情况是您将拥有34个服务合同,每个平均有6个方法。如果您确定每个类上的每个方法都必须作为服务操作发生,那么才会出现这种情况。您需要考虑两个方面。方面1:您的服务设计。您应将34个类分组为有意义的组,并为每个组创建一个服务合同。例如,您可能最终会得到一个InventoryManagement服务,一个SalesOrderProcessing服务和一个BackOfficeOperations服务。每个服务包含与其领域中分组的类相关的服务操作(和数据合同)。 方面2:客户端上正在发生什么。我提到您必须考虑每个类的方法是否必须是WCF服务操作。当然,有理由在客户端上拥有丰富的完全封装的业务类。并且当它们的操作不需要作为服务操作执行时,这些操作将在客户端域中执行其逻辑。问题变成如何通过服务将它们传递到客户端,在这里您有两个选择:a)在客户端上实例化一个实例,并从由服务操作返回的DataContract填充其属性。 b)像CSLA框架一样直接从服务操作返回对象(我认为DevForce遵循类似的方法返回业务类通过WCF服务)。 希望对您有所帮助。


1
那么,如果我有大约34个类,每个类平均有6个公共方法,那么在服务中我会有204个包装器方法吗?这样可以吗? - Nilotpal Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接