我有一个可以返回多个不同集合的WCF服务。
每个集合中的对象都可以引用其他集合中的对象。例如。我有一系列订单和一系列客户。客户对象包含订单引用的集合,每个订单都包含客户引用。
我想知道人们通常如何在客户端处理这类事情。据我所知,我的选择是:
1)让WCF完整地序列化任何成员对象,不要担心重复。我知道我可以在某种程度上使用[PreserveReferences]来缓解这种情况,但仍然存在大量的重复和不必要的序列化。即,如果我从服务请求客户对象,它将序列化客户拥有的每个订单的所有成员,即使我已经在我的订单集合中的客户端上有这些对象。这也意味着我必须小心地按ID匹配事物,而不是仅仅比较实例。
2)Serialise Id而不是实例。这似乎是最明智的方法,但意味着我必须有一些观点,我在客户端再次将这些Id转换为实例。这会带来一堆乱七八糟的地方,以及如何注入所需的存储库来进行连接。
3)只需在客户端的任何地方使用Id,而不是连接实例。这对我来说感觉不对,并且远离OOP的整个观点。我不必访问对象的集合,而是访问id的集合,然后通过一些全局存储库查找它们。
目前我倾向于2,但我不喜欢序列化的混乱。
我应该注意到,客户端可能比大多数WCF客户端更有状态,并且它通过回调等维护与服务的开放连接以维护其集合,因为它正在显示实时数据。
干杯
答案 0 :(得分:1)
我认为另一个选择是默认情况下不检索数据集合。使用您的示例,我可以定义几个WCF方法:
ListCustomers() - 返回客户对象但不填写订单集合 ListOrders() - 返回订单对象,每个对象都附有客户对象,但客户对象没有订单信息。
ListOrdersForCustomer(id customer) - 返回特定客户的订单。
当然,这有其自身的缺点,但可能适用于您的示例。
答案 1 :(得分:0)
我有12个月的经验,我想我会用我的解决方案更新。
我现在使用单独的DTO对象进行WCF上的序列化。其中一些使用id,一些包含完整的对象图。使用DTO的美妙之处在于我可以根据呼叫者的需要返回同一业务对象的不同格式。
在客户端,我实际上有两层。 DTO可以直接从服务中使用(通过请求仅包含我需要的完整对象图),但我还在客户端维护一组业务对象的存储库。这些repos使用只有id的DTO更新自己,并且在DTO被转换为业务对象时完成引用的连接。正如我在我的OP中所说,我的客户端比大多数WCF客户端更有状态,并且repos还会监听带有更新对象的服务回调。
结果是客户端代码可以使用客户端repos,就像它们在服务端运行一样,并且可以连接对象引用而无需通过网络重复信息。