Получатель объекта Datacontracts работает дважды - PullRequest
1 голос
/ 20 апреля 2010

У меня есть набор контрактов данных, которые действуют как оболочки для базовых классов, которые мы хотим выставить. Быстрый пример:

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

    private set{}
}

У нас есть некоторые другие свойства, которые мы должны сначала массировать данные (мы конвертируем графы объектов и должны быть защищены от циклических ссылок).

Проблема, с которой мы сталкиваемся, заключается в том, что этот геттер сработает дважды: один раз в рамках операции службы, затем снова во время сериализации. Это вызывает две проблемы:

  1. Мы вручную добавляем в коллекции, так как это выполняется дважды, коллекции заполнены дуплексами.
  2. Если во время второго запуска выдается исключение, оно происходит вне операции try / catch в операции и не выдает ошибку. Служба выдает загадочное сообщение об истечении времени ожидания, и единственный способ увидеть ошибку - это журналы трассировки WCF.

1 Ответ

0 голосов
/ 20 апреля 2010

Вы можете просто «кэшировать» значения. Например:

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;
        }
    }
}
...