Свойства, связанные с атрибутами DataMember
, определяют только то, что будет включено в сгенерированный WSDL / XSD.Клиент будет генерировать своих классов на основе wsdl / xsd для использования с сервисом.Он не использует те же классы, которые используются на сервере.
Вот почему вы не получите:
- никаких конструкторов, определенных в
DataContract
class - любые частные
[DataMember]
свойства / поля (клиент всегда будет генерировать публичные свойства / поля) - любое поведение, определенное в
DataContract
class
Представьте себе сценарий, когда клиент Java хочет подключиться к вашему сервису.Ожидаете ли вы, что классы Java будут сгенерированы одним и тем же конструктором?А как насчет атрибутов [OnDeserialized]
?Как насчет клиента сценариев Java или клиента Python?
Когда вы начинаете думать об этом таким образом, вы начинаете понимать, почему у вас не может быть того, чего вы хотите (по крайней мере, без совместного использования библиотек между клиентом и сервером).).
Реальность такова, что вы не можете заставить клиента иметь классы, которые всегда имеют значения по умолчанию, и вы не можете заставить клиента всегда отправлять обратно действительные данные, клиент всегда может просто отправить сообщение, содержащее мусор, еслиэто хочет.У вас есть небольшой контроль над некоторыми аспектами сообщения с помощью IsRequired
и 'EmitDefaultValue`, которые добавят проверки в xsd, чтобы убедиться, что что-то присутствует в сообщении, но вам придется выполнить проверку на сервере, вы можетеНе думайте, что объекты, которые вы получите, будут проверены.
Я бы предложил создать DTO из ваших доменных объектов для отправки по проводам, которые не содержат никаких проверок, это всего лишь простые пакеты для хранения данных.Затем создайте фабрики, чтобы превратить ваши доменные объекты в DTO, а DTO в клиентские объекты.Фабрика просто принимает DTO и передает членов в конструктор объекта домена.Тогда ваша логика проверки может жить в конструкторе объекта домена, которому он принадлежит.С подходом, который у вас есть в настоящее время, вы, вероятно, в конечном итоге слегка повернете проверку, так что это можно сделать как из конструктора, так и из метода [OnDeserialized].