1

我在单独的程序集中定义了一个接口和一个类,如下所示:

namespace DataInterfaces
{
    public interface IPerson
    {
        string Name { get; set; }
    }
}

namespace DataObjects
{
    [DataContract]
    [KnownType( typeof( IPerson ) ) ]
    public class Person : IPerson
    {
        [DataMember]
        public string Name { get; set; }
    }
}

这是我的服务接口:

public interface ICalculator
{
    [OperationContract]
    IPerson GetPerson ( );
}

当我为我的客户更新我的服务参考时,我在 Reference.cs 中得到了这个:

public object GetPerson() {
    return base.Channel.GetPerson();

我希望 KnownType 会给我 IPerson 而不是这里的“对象”。

我也尝试[KnownType( typeof( Person ) ) ]过同样的结果。我可以控制客户端和服务器,所以我在这两个地方都有我的 DataObjects(在其中定义了 Person)和 DataInterfaces(在其中定义了 IPerson)程序集。我有什么明显的遗漏吗?我认为 KnownType 是能够使用 WCF 接口的答案。

----- 更多信息 ----- 我从 Person 类中删除了 KnownType 并添加了

[ServiceKnownType( typeof( Person ) ) ]

到我的服务接口,正如理查德所建议的那样。客户端代理看起来还是一样的,

public object GetPerson() { return base.Channel.GetPerson();

,但现在它不会爆炸。但是,客户端只有一个“对象”,因此它必须在它有用之前将其转换为 IPerson。

        var person = client.GetPerson ( );
        Console.WriteLine ( ( ( IPerson ) person ).Name );
4

3 回答 3

1

如果您需要服务合同上的 [ServiceKnownType],则 IPerson 程序集不需要 Person 程序集的知识。

[ServiceKnownType(typeof(Person))]
public interface ICalculator
{
    [OperationContract]
    IPerson GetPerson ( );
}

或者,您可以使用采用方法名称的 KnownType构造函数的版本。然后可以从配置文件中找到已知类型

但是,我不明白您为什么在合同上使用接口。契约是传递消息的定义——在这种情况下接口如何提供帮助?

于 2012-07-03T22:53:27.527 回答
0

继承的整个想法是基类不知道专门的类。用专门的类型装饰数据契约基类(通常定义在一个通用的 dll 中)似乎违反了基本的 OOD 原则?恕我直言 SvcUtil 应该为您完成这项工作,并在生成代理时使用已知类型。似乎在开发 svcutil 时甚至没有考虑基本的 OO。

于 2014-06-12T03:20:10.913 回答
0

您需要将 KnownType 放在 IPerson 而不是 Person 上,如下所示:

[KnownType(typeof(Person))]
public interface IPerson
{
    string Name { get; set; }
}
于 2012-07-03T22:30:40.770 回答