1

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

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

    private set{}
}

我们还有一些其他属性,我们必须首先处理数据(我们正在转换对象图并且需要防止循环引用)。

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

  1. 我们手动添加到集合中,因为它运行了两次,集合中充满了欺骗。
  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 回答