2011-01-18 5 views
13

svcutilを使用してWCFプロキシを作成している間に契約同様のデータコントラクトが継承するインタフェースを含むことが可能である:WCFとのインタフェースは、

public class SomeType: ISometype 
{ 
    public string Name { get; set; } 
} 

public interface ISometype 
{ 
    public string Name { get; set; } 
} 

私はこれを使用してプロキシを作成し、 SomeTypeタイプはクライアントで作成されますが、インターフェースは作成されず、継承もありません。私はDataContractとしてインターフェイスをマークしようとしましたが、その属性は許可されていません。

私は何をしようとすることは可能ですか?

答えて

21

WCFは、シリアル化されたメッセージングを使用し、すべてのそれらのメッセージは、DataContractSerializerかを使用して直列化することができるようにする必要がありますXmlSerializerそして、クライアントとサーバーの間に流れるメッセージは、XMLスキーマで表現可能である必要があります。

XMLスキーマは、インターフェースについては何も知らないため、具体的な、実際のタイプに関するものです。通常のシナリオでは、クライアントが.NETからPHP、Ruby(何でも)まで何でも構いませんが、XMLスキーマで表現できる方法でクライアントとサーバーの間で送信したいものすべてを表現する必要があります。できません。だから、実際には一般的なシナリオでこれをサポートする方法はありません。

ワイヤの両端を制御している場合(例:

  • すべて別々のMyServiceContractsアセンブリに

  • をごDataContracts(とあなたのServiceContractsとOperationContractsとFaultContracts)を入れ

    • :あなたは、クライアントとサーバーの両方を書き、そして両方.NETで、その後、あなたがこれを行うことができます

      このアセンブリは、サービス側のコードとクライアントの両方から参照してください。その場合、クライアントプロキシを作成しようとすると、あなたが言及したタイプはすでに存在しており、WCFはそのアセンブリからそれらのタイプをうまく再利用します。これは参照している.NETアセンブリなので、.NETがサポートするもの(インターフェイスを含む)は何でも持つことができます。

    +0

    ありがとうmarc_s私はこのアプローチを試みます。 – ganeshran

    +0

    説明marc_sをありがとう、私はganeshranは自分自身に似たようなケースを検討していると仮定します。目標は、サービスメソッドを介してサーバにISometypeを実装するfooのインスタンスを渡すことではなく、サービスのコンシューマにおける具体的な依存関係を避けることです。他のレイヤー内のすべてのオブジェクトを複製せずに無限のマッピング(オートマッパまたはその他の方法)を使用することなく、私が使用しているサービスには何百もの種類と数千の属性があります。 – RobD

    2

    あなたはISometypeを実装するクラスから継承し、KnownType属性を使用してシリアライズに追加することができます

    Can I force svcutil.exe to generate data contracts for a WCF service?

    +0

    ありがとうございましたArtem、しかし、私の関心は、生成された型にもインターフェイスISomeTypeを実装することです。私はKnownTypesがその機能を提供するとは思わない。 – ganeshran

    関連する問題