1

公開したい基本クラスのラッパーとして機能する一連のデータコントラクトがあります。簡単な例は次のとおりです。

[DataMember]
public List<decimal> Points
{
    get
    {
        return sourceObject.ListPoints();
    }

    private set{}
}

最初にデータをマッサージする必要がある他のプロパティがいくつかあります(オブジェクトグラフを変換しており、循環参照から保護する必要があります)。

私たちが見ている問題は、このゲッターが2回起動することです。1回はサービス操作内で、もう1回はシリアル化中に起動します。これは2つの問題を引き起こしています:

  1. コレクションは2回実行されているため、コレクションに手動で追加します。コレクションは重複で埋められます。
  2. 2回目の実行中に例外がスローされた場合、それは操作のtry / catchの外部で発生し、障害をスローしません。このサービスは不可解なタイムアウトメッセージをスローします。エラーを確認する唯一の方法は、WCFトレースログを使用することです。
4

1 に答える 1

0

値を単純に「キャッシュ」することができます。例えば:

public class MyWrapper
{
     public MyWrapper(SourceObject sourceObject)
     {
         this.Points = sourceObject.ListPoints();
     }

     [DataMember]   
     public List<decimal> Points { get; private set; }
}

編集:またはもっと怠惰に:

public class MyWrapper
{
    public MyWrapper(SourceObject sourceObject)
    {             
    }

    private List<decimal> points;

    [DataMember]   
    public List<decimal> Points
    {
        get
        {
            if (this.points == null)
            {
                this.points = sourceObject.ListPoints();
            }

            return this.points;
        }
    }
}
于 2010-04-20T15:12:49.087 に答える