2009-06-21 9 views
1

私はサーバー上で受け取ったdatacontractオブジェクトを取得しようとしていますが、その上で何らかの操作を行ってからアップキャストされたバージョンを返しますが、動作していないようです。私はKnownTypeまたはServiceKnownType属性を使って動作させることができますが、すべてのデータをラウンドトリップしたくありません。以下は例です:WCF DataContract Upcasting

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

[DataContract] 
public class MyDerivedObject : MyBaseObject 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 


[ServiceContract(Namespace = "http://My.Web.Service")] 
public interface IServiceProvider 
{ 
    [OperationContract] 
    List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects); 
} 

public class ServiceProvider : IServiceProvider 
{ 
    public List<MyBaseObject> SaveMyObjects(List<MyDerivedObject> myDerivedObjects) 
    { 
     ... do some work ... 

     myDerivedObjects[0].Id = 123; 
     myDerivedObjects[1].Id = 456; 
     myDerivedObjects[2].Id = 789; 

     ... do some work ... 

     return myDerivedObjects.Cast<MyBaseObject>().ToList(); 
    } 
} 

誰もが、これは新しいオブジェクトを再作成することやKnownType属性を使用せずに動作させるためにどのように任意のアイデアがありますか?

答えて

0

あなたの問題は、一般的なリストを送信しようとしていることだと思います。

リストをオブジェクトにカプセル化すると機能します。これは、一般的なリストである単一のパブリックプロパティを持つオブジェクトを作成します。

また、契約で直接使用されていないすべてのクラスがシリアライズ可能としてマークされていることを確認する必要があります。

+0

IListが問題なく送信します。それは私が動作しないオブジェクトをアップキャストしようとするときです。私はすべてのデータをラウンドトリップしたくありません。 –

+0

カスタムマッピングコードまたはインターフェイスを使用できます。 –

0

派生オブジェクトを返す場合は、クライアントとサービスが別々のため、常に往復があります。クライアントがMyBaseObjectsの独自のリストを更新するためには、サーバから来たMyDerivedObjectsのリストを逆シリアル化する必要があります。

KnownTypeおよび/またはServiceKnownTypeの使用は、WSDLにその型情報を追加するために必要です。これは、クライアントが正しいタイプにメッセージを逆シリアル化するために使用されます。手始めに

、あなたが説明してきたシナリオをテストするための便利なツール:http://www.wcfstorm.com

+0

きれいなユーティリティ! :)私はそれを試してみる必要があります。アップキャストに関して、ベースオブジェクトをインスタンス化して値を設定すると、それをうまく送信できますが、余分な作業を避け、派生オブジェクトをアップキャストしたいと思います。それの外見から、これは不可能です。 –

0

あなたはDataContractSurrogate(IDataContractSurrogate)を作成し、GetDataContractTypeへの呼び出しのためのあなたの基本型を返すてみてください。私はそれが本当にあなたが "余分な仕事"の方が良いかもしれないようにそれが使われることを意図していたのかどうかは分かりませんが、その余分な仕事の範囲を理解していないかもしれません。

0

WCF(と.netリモーティング)の問題の1つは、「メッセージパッシング」をメソッド呼び出しのように見せようとすることです。

これはあまりにも多くの "oop"タイプのデザインを使用しようとすると倒れます。

メッセージは、.NETのクラスで表さ であるという事実は、ない は クラス.NETのような彼らの行動のすべてを作るん。

漏れ抽象化の問題については、thisthisを参照してください。

WCFインターフェイスを設計するときにメッセージを渡すことについて考え始める必要があります。そうしないと、多くの問題が発生します。

関連する問題