我们正在构建可以被其他系统使用的产品。因为我们有 SOA,所以我们只开发一个服务 (WCF)。我们就如何设计该服务的界面进行了几次有争议的讨论。我们在服务的程序设计和面向对象设计之间进行选择。
由于我们的服务将使用 .NET 和 Java,有人说如果它具有 OO 设计,则很难与服务集成。其他人认为服务桅杆不使用OO方法。有人说OO完全没问题。结果,我们没有明显的抑郁症。
WCF 提供了使用这两种设计的简单方法,但最好的方法是什么?
我们正在构建可以被其他系统使用的产品。因为我们有 SOA,所以我们只开发一个服务 (WCF)。我们就如何设计该服务的界面进行了几次有争议的讨论。我们在服务的程序设计和面向对象设计之间进行选择。
由于我们的服务将使用 .NET 和 Java,有人说如果它具有 OO 设计,则很难与服务集成。其他人认为服务桅杆不使用OO方法。有人说OO完全没问题。结果,我们没有明显的抑郁症。
WCF 提供了使用这两种设计的简单方法,但最好的方法是什么?
我假设您使用的“面向对象”的定义是管理“对象”的程序的概念,这些单独的对象管理它们的内部状态并公开要调用的函数。
与此最接近的 WCF 并行是基于会话的服务,其中每个服务实例的生命周期由客户端控制。
如果您希望 Java 调用此服务,则必须使用 basicHttpBinding,因为它使用经典的 Web 服务协议。
此绑定不支持基于会话的服务,因此您实际上不能使用基于会话的服务。
因此,您不能将“面向对象”范式应用于服务本身。
您通过说:“我的问题是关于服务的方法,它们应该接收复杂类型而不是标量参数吗?”
你应该问自己以下问题:
a) 非 OO 客户是否有可能使用该服务?不知道,COBOL 批次?即使您的公司已在 OO 技术(Java/.NET)上标准化,该特定服务是否有可能在未来被某些外部实体(客户、PHP 网站等)使用
b)您过去是否已经创建了许多这样的服务(因此您完全确定复杂类型不存在编组/序列化/反序列化问题,或者至少知道您可以安全地使用什么)?
如果您对这两点完全有信心,那么请随意使用“OO”方法为您的服务设计输入和输出。否则,请采用最安全(如果更原始)的方法,并将“对象”分解为标量组。