2009-03-18 18 views
5

私は2つのオブジェクトを持っています.1つはエンタープライズレベルであり、もう1つはサービスレベルです。サービスオブジェクトは、エンタープライズから継承しています。ここでは簡単な例です:オブジェクト継承によるWCF直列化?

[DataContract] 
public class EnterpriseObject{ 
    [DataMember] 
    int ID{get; set;} 

    string InternalUse{get; set;} 
} 

[DataContract] 
public class ServiceObject: EnterpriseBaseObject{ 
    [DataMember]  
    string Address{get; set;} 
} 

はそれだけで連載中(EnterpriseObjectから継承されたプロパティを持つ)ServiceObjectを公開することは可能ですか?私は、クライアントがオプションとしてリストされたエンタープライズオブジェクトを見ることを望んでいませんか?この例でわかるように、DataMember属性はInternalUserプロパティに設定されていません。これが唯一の方法ですか?ありがとう

答えて

7

EnterpriseBaseObject[KnownType(typeof(ServiceObject))]を追加して継承を処理しますが、EnterpriseBaseObjectは引き続き契約の一部であり、その存在は公開されます。しかし、[DataMember]と記されたメンバーだけが公開されます。

継承を削除するための1つのオプションは、シリアル化の目的で別個のDTOを持ち、DTOバージョンと実際のバージョンとの間で変換を行うことですが、余分な作業が必要です。

+0

これは多くの助けになりました! – Slavo

2

これをIs AパターンからHas Aパターンに変更することはできますか? ServiceObjectにEnterpriseObjectがある場合は、必要なプロパティだけを公開することができます。

編集

私が正しく理解していれば、あなたがEnterpriseObjectから継承されたプロパティを含む(データメンバーとしてマークされている)すべてのプロパティを含むクライアントにServiceObjectを公開します。しかし、EnterpriseObjectというオブジェクトがあることをクライアントに知らせたくない場合。

これは、エンタープライズオブジェクトが存在することを隠すことで可能です。継承パターンである "Is A"関係を使用する代わりに。あなたはコンポジションまたは "Has A"パターンを使用できます。

public class ServiceObject 
{ 
    private EnterpriseObject _myEntObject; 

    public string MyServiceObjectProperty 
    { 
     get; 
     set; 
    } 

    public string MyEntObjectProperty 
    { 
    get { return _myEntObject.MyEntObjectProperty;} 
    } 
} 

これで、クライアントからEnterpriseObjectを分離しました。あなたのすべてのコミュニケーションは、ServiceObjectにはクライアントに公開されていないいくつかのプロパティがあり、これは他のオブジェクトによってサーバー上で実装されているということです。

これはまた、データを送信する目的だけの目的であるDTOを持つことと同じです。 DTOでは、内部オブジェクトを公開することなく、クライアントが必要な形式で必要なものを、必要な形式で正確に提供できるため、実装を隠すことができます。

+0

あなたがここで何を意味するか分かりません。あなたは説明できますか? – DDiVita

+0

あなたの言っていることが分かります。それは興味深いアプローチです!ありがとう! – DDiVita

関連する問題