2009-03-23 32 views
20

私は最初のWCFサービスを書いています。私はまずDLLとしてサービスを書いて、次にWCFのものを私が今どこにいるのかをアスペクトにすることに決めました。WCF:MessageContract、DataContract ...混乱していますか?

私は、私が行ったメッセージオブジェクトのための特定のフォーマットに固執すべきであると建築家からアドバイスを受けました。しかし、私はメッセージオブジェクトにInterfaces、複合型、およびそのリストを使用しました。私は属性を追加するために来ていると私は少し混乱している。

ここに私のコードのショーの例があります。

[ServiceContract] 
public interface MyServiceContract 
{ 
    [OperationContract] 
    MyMethodResponseMessage MyMethod(MyMethodRequestMessage request); 
} 

public class MyService : MyServiceContract 
{ 
    public MyMethodResponseMessage MyMethod(MyMethodRequestMessage request) 
    { 
     //Do things 
    } 
} 

//Messages 
[MessageContract] 
public class MyMethodResponseMessage 
{ 
    [MessageBodyMember] 
    public MyMethodResponse Body { get; set; } 
} 

[DataContract] 
public class MyMethodResponse 
{ 
    [DataMember] 
    public IMyComplexTypeItem { get; set; } 

    [DataMember] 
    public List<IMyComplexType> Items { get; set; } 

    [DataMember] 
    public bool Success { get; set; } 
} 

//DTO  
public interface IMyComplexType 
{ 
    [DataMember] 
    string Identity { get; set; } 
} 

[DataContract] 
public class MyComplexType1 : IMyComplexType 
{ 
    [DataMember] 
    public virtual string Identity 
} 

誰もがMessageContract、のDataContract、DataMemberプロパティおよび直列化などの使用に正確にコメントすることができますか?どんな指針や目障りな間違い?

また、どのシリアライザを使用するのが最適ですか?他のクライアントが私のサービスを簡単に使用できるように、これから正しい形のXMLを得るための最良の戦略は何ですか?

答えて

15

リクエスト/レスポンス - [DataContract]も同様に機能します。メッセージ契約の利点の1つは、メンバーに対してプライバシーを設定できることですが、多くの場合、これは必要ではありません。そのような場合、私は契約をデータ契約と同じようにできるだけシンプルに保つことを好みます。

Reはシリアライザです。これは主にコンフィギュレーションの要因です。デフォルトでは、たとえばhttp以上の場合はDataContractSerializerになります。

しかし、IMyComplexTypeのリストがうまくいくかどうかはわかりません。試してみることもできますが、一般的には具体的なタイプが必要です。ベースクラスでは、[KnownType]を使用して、許可されたサブタイプを指定できます。

コレクションメンバーがセッターを持つ必要はありませんが、リストアを行う場合はリストを初期化するためにコールバックメソッドを追加する必要があります(WCFはコンストラクターを呼び出さない)。

脇:protobuf-netをデータコントラクトとWCFで使用することもできます(オーダーが明示的である限り)。これは通常のxmlよりも密集しています。しかし、現時点ではメッセージ契約はサポートされていません。

+0

おかげでマルク、あなたは基本クラスについて正しいです。それは少し良く働いています。私はOnDeserializingメソッドを見て、頭を上げてください。私はこのためにXmlに拘束されています。 –

2

あなたの質問にない直接の答えは、それは個々のメッセージヘッダとメッセージ本体部分がシリアライズされMSDN -Using Message Contracts

から、次のことに注意してくださいする価値があるものの選ばれた直列化を使用して(XMLになって)メッセージが使用されるサービス契約のエンジン。デフォルトの直列エンジン、XmlFormatterは、データコントラクトを持っている任意のタイプ、明示的のいずれかを処理することができます(システムを持つことで。Runtimeを。シリアライズ。DataContractAttribute)または暗黙的(プリミティブ型であることによって、持ちますSystem.SerializableAttributeなど)。

enter image description here

関連する問題