частичный метод OnCreated не вызывается, когда ожидается - PullRequest
4 голосов
/ 06 декабря 2011

Я расширил класс своего домена на стороне клиента Silverlight в частичном классе. В частности, я добавил свойство RelayCommand, к которому я буду привязывать кнопку. Свойство RelayCommand необходимо инициализировать, и поэтому может показаться, что лучшее место для этого - частичный метод OnCreated.

Однако я понимаю, что, когда объект с сервера материализован на стороне клиента, его конструктор не вызывается (что кажется мне неправильным!) Поскольку его конструктор не вызывается, он не вызывает метод OnCreated.

Существует ли конфигурация или соглашение для вызова этого частичного метода OnCreated при вызове объектов?

Ответы [ 2 ]

7 голосов
/ 06 декабря 2011

DataContractSerialization не вызывает конструктор объектов, которые он десериализует.Это решение было принято, потому что с предыдущими методами сериализации в .NET всегда была необходимость иметь конструктор по умолчанию для любого объекта, который собирался сериализовать, было проблемой.Это не относится к RIA Services, это было дизайнерское решение, принятое при создании самого WCF, и нет конфигурации для его изменения.

Дополнительную информацию можно найти на http://blogs.msdn.com/b/carlosfigueira/archive/2011/09/06/wcf-extensibility-serialization-callbacks.aspx, а также на примерах.о том, как вы можете использовать [OnDeserialized] для репликации эффекта вызываемого конструктора.

Однако существует вторая проблема, которая может вызвать проблемы.Сущности создаются все время.Например, каждый раз, когда вы вызываете TEntity.GetOriginal, создается новая отдельная сущность и возвращается из метода.Это делает попытки сделать что-то вроде настройки RelayCommand потенциальной проблемой производительности и стабильности.Возможно, вам лучше настроить RelayCommands на уровне DataService или ViewModel, а не внутри самой сущности.

5 голосов
/ 06 декабря 2011

Частичный метод OnCreated () вызывается только тогда, когда вы создаете экземпляр Entity, используя его конструктор по умолчанию.

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

...