Как заставить контракты кода работать с десериализацией контрактов данных? - PullRequest
7 голосов
/ 07 августа 2011

Я написал ContractInvariantMethod для класса контракта данных, и все отлично работает на стороне клиента, однако, когда объект этого типа отправляется в мой сервис, и десериализатор контракта данных пытается его десериализовать, код контракта проверка мешает и выдает ContractException, говоря, что инвариант не выполнен. Причина в том, что в конструкторе (по умолчанию) класса я установил свойства для удовлетворения инварианта, но, очевидно, конструктор не вызывается при десериализации объекта. есть ли решение для этого?

вот мой класс контракта данных:

[DataContract]
public class DataContractClass
{
 public DataContractClass()
 {
  this.Field1= this.Field2= -1;
 }
 [DataMember]
 public int Field1 {get; set;}
 [DataMember]
 public int Field2 {get; set;}

 [ContractInvariantMethod]
 private void Invariants()
 {
  Contract.Invariant(this.Field1== -1 || this.Field2== -1);
 }
}

1 Ответ

6 голосов
/ 07 августа 2011

Во время проверки во время выполнения инварианты проверяется в конце каждого открытого метода.

Таким образом, когда Serializer устанавливает Property1 и Property2 не в -1, вы получаете исключение контракта, потому что десериализатор не использует конструктор.

Так что используйте это:

public DataContractClass()
{
    SetDefaults();
}

[OnDeserializing]
private void OnDeserializing(StreamingContext context)
{
    SetDefaults();
}

private void SetDefaults()
{
    Property1 = -1;
    Property2 = -1;
}
...