【发布时间】:2011-01-02 14:10:54
【问题描述】:
问题:
WCF 契约对象不能实现 2 种类型的列表(即:List 和 List)。
啰嗦的解释:
我正在现有核心系统之上构建 WCF 服务,并且我正在尝试找出实现我的一些业务对象的最佳方法。
核心系统使用所有业务对象的接口——例如,人员管理功能需要我传入一个实现 IPerson 的对象。这里没有什么不寻常的地方。
目标是有一个联系人对象(Person),它可以用在事物的服务端,并且还实现了IPerson,这样它就可以在不需要转换层的情况下传递到核心。这一切都适用于像 Person 这样的项目。
问题出现在列表中:例如,核心中的一个方法可能需要传入一个 IPersonList,并且任何处理过继承泛型的人都知道,List 不会从 IList 继承。
在我们当前运行的 ASMX 服务中,我们通过 Web 对象中的一些向上/向下转换来实现这一点。 “WebPerson”将从 List 继承,并显式实现 IList,这样 IList 属性就不会显示在 WSDL 上。
但是,在 WCF 中,如果您尝试使用同一个对象,则会收到以下错误:
具有 CollectionDataContractAttribute 属性的类型“Cssi.IBroker.Service.Cssi.Contracts.PersonList”是无效的集合类型,因为它具有接口“IList`1”的多个定义。
显然,现在新的 WCF 序列化程序知道如何序列化 IList,它不再能够忽略第二个显式实现。
如果可能,我想避免仅为合同创建 PersonList 对象,然后为每次调用转换为 IPersonList 对象和从 IPersonList 对象转换。更改核心业务逻辑以使用专为 WCF 服务设计的具体对象不是一种选择。
救命!
【问题讨论】:
-
我应该补充一点,已经讨论过的另一个选项是将干净的 WSDL 设计抛诸脑后,在我们的服务合同中返回接口并将 ServiceKnownType 属性添加到我们的合同中。因为对于这个 WCF 服务,我们将同时控制服务和客户端,这是一个选项,但这有效地将任何未来的客户端与使用 .Net 和我们的代理类联系起来,因为我们的 WSDL 实际上是无用的。我也希望避免使用此选项。
标签: wcf serialization service interface soa