После дальнейшего размышления о последствиях DataContractSerializer, не вызывающего конструкторы или инициализаторы статических полей , кажется, что более чистый шаблон проектирования имеет свойства, которые самоинициализируются следующим образом:
private ObservableCollection<object> myObjects;
public ObservableCollection<object> MyObjects
{
get
{
if (myObjects == null) myObjects = new ObservableCollection<object>();
return myObjects;
}
set
{
myObjects = value;
}
}
какВ отличие от предоставления двух путей инициализации, подобных этому:
public MyClass()
{
InitializeClass();
}
[OnDeserialized()]
private void OnDeserialized(StreamingContext c)
{
InitializeClass();
}
private void InitializeClass()
{
// Note here I can still use a field.
// Self-initialization requires a property.
myObjects = new ObservableCollection<objects>();
}
Моя основная проблема заключается в том, что последний шаблон не будет проваливать модульные тесты, которые создают класс с new
, если специальная инициализация OnDeserialized
будет забыта, если толькоэти модульные тесты специально разработаны для того, чтобы знать, что они могут использоваться с DataContractSerializer
в какой-то момент.
Это кажется слишком запутанным.
Недостатком подхода самоинициализации является то, что он требует свойств, а не полей (поскольку инициализаторы полей игнорируются DataContractSerializer
).
Есть ли другие недостатки, которые я не рассматриваю?