Коллекции в DataContracts в сценариях частичного доверия - PullRequest
0 голосов
/ 12 апреля 2009

Я был довольно смущен одним моментом при разработке DataContracts для сериализации.

Скажем, у меня есть объект (например, клиент), и он предоставляет свойство коллекции (например, AddressCollection с именем Addresses). Руководящие принципы разработки инфраструктуры требуют, чтобы я не предоставлял открытый мутатор для свойства, т. Е. Свойство коллекции должно иметь метод get и no set, а вместо этого - метод открытого набора (public void SetAddresses (IEnumerable

address)).

Но если я хочу сериализовать этот объект и ожидаю, что буду в среде с частичным доверием, могу ли я иметь , чтобы добавить открытый установщик в свойство, чтобы его можно было правильно десериализовать?

Кроме того, если при сериализации в коллекции ничего нет, а конструктор по умолчанию не вызывается DataContractSerializer, я почти уверен, что коллекция вообще не установлена ​​и оставлена ​​как нулевая. Я мог бы использовать атрибут OnSerializing для инициализации коллекции, но тогда этот метод также должен быть публичным в сценарии частичного доверия, не так ли? И это еще страшнее.

Кто-нибудь знает соответствующее руководство здесь?

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 14 апреля 2009

Да, это проверенное и настоящее ОО мышление встречает новые инструменты. :) Мне нравится думать об этом с точки зрения DTO паттерна . Я установил свои настоящие бизнес-объекты как можно ближе к свободному от мутаторов, насколько это возможно, а затем использую набор объектов DTO, предназначенных для сериализации (публичные свойства, пустые конструкторы и т. Д.). Это не идеальное решение, но обнаружил, что если вы попытаетесь смешать очень богатые наборы объектов с сериализацией, это может стать уродливым. Лучше отделить их.

0 голосов
/ 14 апреля 2009

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

...