2012-06-21 3 views
0

Когда вы создаете новый проект WCF, для вас создается образец сервиса. Контракт данных по умолчанию является (я только изменил тип строки название поля):Почему частные поля в контрактах на данные изменяются через публичные?

[DataContract] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string name = ""; 

    [DataMember] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
} 

Какой смысл иметь эти частные поля boolValue и имя? Является ли хорошей практикой писать некоторые данные, дезинфицирующие или какие-то другие манипуляции в контракте, таким образом, раздувая его? Кажется, единственная разумная причина для меня не писать в поля напрямую. Так ли это вирусы или у него есть какая-то причина?

ответ

2

На мой взгляд, DataContracts особая цель должна заключаться в передаче данных между доменами. Логика проверки/дезинфекции должна находиться за пределами обязанностей DataContract. Особенно, если целью является совместное использование/связывание файла кода в нескольких проектах/платформах для повторного использования.

Это также означает, что у вас не должно быть объекта DataContract, используемого в другом месте вашего приложения. Для чтения/записи содержимого в объекты, зависящие от приложения, должен пройти какой-то адаптер или конвертер. Его в этом преобразовании (или в ваших объектах приложения), где вы можете выполнить некоторую проверку. Чем проще ваш уровень передачи данных, тем лучше.

Возможно, вы можете добавить код регистрации/отладки в сеттеры/получатели (желательно временно) для отслеживания ввода/вывода данных по мере необходимости. До сих пор это единственный случай, когда я чувствовал себя хорошо, чтобы поставить что-нибудь, кроме простых свойств в объекте DataContract (и, опять же, я сделал это временно).

EDIT: Что касается того, почему это файл по умолчанию, я не уверен. Объекты DataContract всегда используют автоматические свойства. Я бы предположил, что это было возвратом к .NET 2.0 до того, как были введены автоматические свойства, но WCF/DataContracts не были введены до 3.0 в любом случае.

1

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

1

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

+0

ОК, вопрос на самом деле состоял в том, следует ли санировать данные ** в ** контракте данных (означает при отправке) или ** перед ** отправкой данных. Я считаю, что контракт с данными может стать ** вздутым **, если я напишу в нем санитарную логику. Так вы не согласны? – Arnthor

+0

Я не согласен. То, что вы называете раздуванием, другое определяет как наилучшую практику разработки программного обеспечения. Да, вы добавляете несколько строк кода, но защитные меры лучше всего того стоят. Кроме того, мы не пишем чипы ROM. У нас есть мощность обработки, пропускная способность и память, чтобы не жертвовать проницательностью на алтаре экономики. – GrayFox374

+0

Ты меня не понял. Данные ** должны быть подвергнуты санитарной обработке, вопрос заключается в том, что он будет дезинфицирован в контрактах с данными или в каком-либо другом месте. Например, это, конечно, не ** звуковая инженерная практика для записи данных, дезинфицирующих код в файл .ascx, вы делаете это в * back-end * .ascx.cs файле. ** Я не спрашиваю о геттерах, сеттерах или проверке. Я был рядом. ** Вопрос был, где провести валидацию. – Arnthor

Смежные вопросы