使用WCF进行对象图序列化时是否有一些最佳实践?

时间:2010-10-05 13:46:28

标签: wcf soa

我正在使用WCF和Entity Framework v4并使用POCO实体。我们的实体拥有大量相关实体。一个对象可以有许多不同类型的子对象,然后又有许多不同类型的子对象。例如,汽车有1个或多个驱动程序。每个司机有0个或多个孩子。然后每个孩子有0或多个朋友。 (有0个朋友的可怜的孩子)。这个例子有点蠢,但你明白了。

如果客户要求购买汽车,那么将汽车列入其驾驶员列表是有意义的。填充并返回每个驾驶员的孩子可能有也可能没有意义。问题还在继续。

因为您的数据库几乎总是只包含互连的表(导致互连的实体),我们应该序列化多少对象图?

  • 在SOA方面有最佳实践吗?
  • 它应该只是直接相关的实体吗?
  • 是否有某种命名惯例?
  • 我们应该使用不同的方法,例如GetCar()和GetCarWithDrivers()?

2 个答案:

答案 0 :(得分:2)

我认为没有任何经验法则,我不喜欢返回客户端不需要的数据的想法。您的服务设计应该由提供给客户的业务功能驱动。因此,如果您希望客户端通常只需要Car,那么您应该定义仅返回Car的操作。如果客户有时也需要Car with Drivers,那么您应该定义第二个操作,它将返回Car with Drivers。

如果您的服务主要用作高级CRUD,则至少返回第一级相关对象可能是合理的,但这又是基于提供的功能的泛化。另一种有用的技术可以是聚合。在聚合中,相关实体没有父实体就没有意义。例如,Car with Driver不是聚合的,因为Driver是独立的实体。但Invoice和InvoiceLine是聚合的,因为您无法在没有Invoice的情况下定义InvoiceLine。在这种情况下,使用所有InvoiceLines返回Invoice会很有用。在所有情况下都不是这样。我在批准申请中工作,允许用户只从他们的成本中心查看和批准Invoice标题和InvoiceLines,因此如果Invoice包含50多个InvoiceLines但允许用户只看到单行,则没有理由将它们全部转移。

考虑您的服务提供的功能,转移对象所需的复杂性将更加清晰。

答案 1 :(得分:1)

我做了一些谷歌搜索并发现以下文章建议只去与客户要求的实体直接相关的实体。对于其他人:Service Orientated vs Object Orientated