2009-04-06 10 views
1

私は継承を使用するいくつかのオブジェクトクラスを持っています。私はサービスで直接使用されているオブジェクトにしかアクセスできないようです。私は私が達成しようとしているものをお見せしましょう:WCFサービスによって直接使用されないオブジェクト(DataContracts)を公開しますか?

[DataContract] 
public class Object1 
{ 
    [DataMember] 
    int Id {get; set;} 
} 

[DataContract] 
public class object2: Object1 
{ 
    [DataMember] 
    string Name {get; set;} 
} 

[DataContract] 
public class object3 
{ 
    [DataMember] 
    int SomeNumber {get; set;} 
} 

サービス:

public int GetId(object2 obj) 
{ 
    return GetTheId(object2.Name); 
} 

を今、私はサービスにobject2は使用しておりますので、オブジェクト1があまりにもシリアライズされます。 Howerver、私は何らかの理由でobject3を露出させたいかもしれません。それは、その型が後で別のプロセスのために決定されるように渡さなければならない派生クラスかもしれません。私はこのオブジェクトがシリアル化されて表示されません。私はあなたがDataContract/DataMemberを設定するたびに、それらのオブジェクトがシリアル化されると仮定しました。あなたが必要としないかもしれないアイテムを公開する問題を見ることができるので、使用されていないものを公開しないことは理にかなっています。サービスによって直接使用されないオブジェクトを公開する最良の方法は何ですか?ありがとう

ダニエル

答えて

1

あなたはKnownType attributeと(クラスの独特の名前を:))object2は飾る必要があります。

[DataContract] 
[KnownType(typeof(object3))] 
public class object2 
{ 
} 

あなたがオブジェクト3がオブジェクト2のサブクラスであることを意味すると仮定すると:

public class object3: object2 
{ 
} 
+0

私はその属性を完全に忘れていました!!!ありがとう。それが私の状況に必要なものです。ありがとう!!!!! – DDiVita

+1

サービス契約を[ServiceKnownType]で飾ることもできます。 :) –

-1

私はあなた自身の質問に答えました。メンバーがサービスで使用されていない場合は、公開しないでください。一般的に、サービスの保守性が向上するため、サービスで必要とされる最小限のデータセットを公開する方が良いでしょう。

+0

正確に、しかし何です直接使用されていないオブジェクトを公開する最も良い方法は? – DDiVita

+0

これは最善の方法ではありません。クライアントが知っておくべき唯一のものは、サービス操作によって使用されるオブジェクトです。 –

+0

これは、これらの状況で継承が現実であるという事実を無視します。これは、コードで設計された契約とXMLスキーマで設計された契約の両方に対して現実的です。クライアントがそのタイプの定義を持つことができるように、継承されたタイプを定義する必要があります。 –

関連する問題