2009-05-14 11 views
0

汎用オブジェクトを渡すことは可能ですか(汎用では、DataContractで、C#汎用コレクションではありません)、1つのルートから継承しないでください。私はこのような何かを持っている現時点では:WCFを介して汎用オブジェクトを渡す方法

[OperationContract] 
void Save(GenericObject o); 

[DataContract] 
[KnownType(typeof(ClassA))] 
[KnownType(typeof(ClassB))] 
class GenericObject {.... 

[DataContract] 
class ClassA: GenericObject {.... 


[DataContract] 
class ClassB: GenericObject {.... 

すべてがOKだったが、プロジェクトが大きくなっていると私は本当に1クラスからのすべてのそれらの契約を導出する余裕はありません。

サービスに特殊なメソッドを追加したくありません。 回避策として、クラスを手動でDataContractSerializerを介して文字列またはバイト[]にシリアル化し、サーバー側でそれらを逆シリアル化することができます。void Save(byte [] serializedObject)

私は簡単に一般的なオブジェクトを返すことができます。 オブジェクトロード(文字列ID) はうまく動作しますが、保存(オブジェクトo)は動作しません。

私はクライアントとしてSilverlightを使用しています。

+0

以下のような回答があります。さらに詳しい情報が必要な場合は、ClassA、ClassB、およびGenericObjectの外観について理解を深めることができます。なぜClassA/B/Cなどではなく汎用オブジェクトを渡したいのですか? – Cheeso

+0

私は、仮想ファイルシステムに格納されている膨大なオブジェクト(ClassA/B/C)を持っているので、汎用オブジェクトを渡したいデータベースの。したがって、私はそれらを格納/取得するために2つのメソッドを使用しています:Save()/ Load()とSaveClassA/SaveClassB/SaveClassCではなく、全く同じシグネチャ(タイプとは別)。 –

答えて

1

はい、WCFプロジェクトには一般的なMessageタイプを使用できます。これは実際には何でもかまいません。しかし、これは、メッセージオブジェクトを作成するクライアント側(一般的にメッセージを構成するXMLを手動で作成する必要があります)とサーバー側の両方で、多くの作業を必要とします。優れたXMLシリアル化/デシリアライゼーションについてあなたは、基本的な生のアングルブラケットスープ(ストレートXML)を扱っています。

それは解決策になるかもしれませんが、他にも、もっとエレガントで便利な解決策がありますか?その継承は本当に必要なのでしょうか?あなたのシステム設計について考えてみてください。

Marc

+0

いいえ、継承は絶対に不要です。その唯一の目的は、汎用オブジェクトをストレージサービスに渡すための回避策を提供することでした。しかし、プロジェクトが大きくなってから、単一のルートからほとんどのDataContractオブジェクトを継承することはできません。 –

+0

marc_sが正しいです。メッセージタイプを受け取ると、継承に関係なく、どのタイプでも使用できます。また、WCFサービスをなぜ使用しているのか、考えてみることに同意します。データアクセスレイヤーをWCFサービスに移動するだけの場合は、そのポイントがありません。 –

関連する問題