Получатель свойств Datacontracts запускается дважды

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

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

    private set{}
}

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

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

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

person BGabriel    schedule 20.04.2010    source источник


Ответы (1)


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

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;
        }
    }
}
person Daniel Rose    schedule 20.04.2010