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

次のように、Person ではなく IPerson に KnownType を配置する必要があります。

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