0

そこで、いくつかの WCF サービスを作成しました。それぞれが特定の種類のデータ コントラクトのリストを返します。ただし、これらのデータ コントラクトには、他のデータ コントラクトのリスト プロパティがあります。データ コントラクト コレクションの遅延読み込みを実装しようとしています。

私が考えたのは、コレクション プロパティをオーバーライドしてデータ コントラクトから継承するクラスをクライアントに実装して、setter メソッドと getter メソッドがサービスを呼び出し、実際のコレクション アイテムを取得することです。

私の質問は: 実際のデータ コントラクトではなく、データ コントラクトを実装するクラスを返すようにベース チャネルを作成するにはどうすればよいですか? ベースチャネルが返すものを制御するにはどうすればよいですか?

私のサービスクライアントは次のようになります。

public class ServiceClient : BaseClient<IServiceClient> 
{
   public IList<DataObject> FindAll() 
   {
       // how to control what base.Channel.FindAll return during deserialization.
       return base.Channel.FindAll();
   }
}

私はこのようなことをしたくないことに注意してください:

public class ServiceClient : BaseClient<IServiceClient> 
{
   public IList<DataObject> FindAll() 
   {
       var dtos = base.Channel.FindAll();
       var dtoProxies = Mapper.Map<DataObject, DataObjectProxy>();

       return dtoProxies;
   }
}

List<DataObject>WCF が、どの要素が実際には type であるかを自動的に返すようにする方法が必要ですDataObjectProxy

これを行う方法に関する提案はありますか?

ありがとう!

編集:サンプル DataObject クラス:

[DataContract]
public class DataObject 
{
   public virtual List<OtherDomainObject> SubItems { get; set; }
}

public class DataObjectProxy : DataObject 
{
   public override List<OtherDomainObject> SubItems 
   {
      get { // Custom way to retrieve collection... }
      set { // Etc.. }
   }
}
4

1 に答える 1

0

まず、DataObjectProxy を [DataContract] 属性で装飾します。WCF では、後で何をするかに関係なく、すべての型に対して明示的なコントラクト ID が必要です。次に、クライアントに公開するデータ コントラクト型のすべてのフィールド (この場合はプロパティ) に [DataMember] を設定します。最後に、DataObject クラスに [KnownType(typeof(DataObjectProxy))] 属性を追加します。KnownType は、クライアントでのポリモーフィック置換のために、指定されたベースのすべてのサブタイプを定義します。これはうまくいくはずです。

[DataContract]
[KnownType(typeof(DataObjectProxy))]
public class DataObject 
{
   [DataMember]
   public virtual List<OtherDomainObject> SubItems { get; set; }
}

[DataContract]
public class DataObjectProxy : DataObject 
{
   [DataMember]
   public override List<OtherDomainObject> SubItems 
   {
      get { // Custom way to retrieve collection... }
      set { // Etc.. }
  }
}
于 2012-11-28T21:45:01.717 に答える