【问题标题】:WCF objects, multiple IList implementation and serialization errorsWCF 对象、多个 IList 实现和序列化错误
【发布时间】: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


【解决方案1】:

我最终决定最好的路线是一组仅用于合同的专用对象。由于它们专注于一项任务,我能够使它们保持清洁,而不必为了 WSDL 而牺牲我的内部设计。对于 WSDL 对象本身,我最终使用数组而不是 IList。

额外的转换步骤有点麻烦,但比试图让我的核心对象保持 WCF 友好要少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多