Datacontracts属性getter运行两次

时间:2010-04-20 15:04:48

标签: c# wcf datacontract

我有一组数据协定,它们充当我们希望公开的基类的包装器。一个简单的例子是:

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

    private set{}
}

我们还有其他一些属性需要先按下数据(我们正在转换对象图,需要防止循环引用)。

我们看到的问题是,此getter将在服务操作中触发两次,然后在序列化期间再次触发。这导致了两个问题:

  1. 我们手动添加到集合,因为它运行两次,集合中充满了欺骗。
  2. 如果在第二次运行期间抛出异常,则它发生在操作中的try / catch之外,并且不会引发错误。该服务抛出一个神秘的超时消息,查看错误的唯一方法是通过WCF跟踪日志。

1 个答案:

答案 0 :(得分: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;
        }
    }
}