Конфликт между избеганием анемичной модели и разрешением сериализации - PullRequest
0 голосов
/ 19 января 2009

В этом ответе на недавний вопрос мне посоветовали

"опасаться, чтобы каждое свойство в вашей доменной модели имело общедоступные методы получения и установки. Вы к анемичной модели предметной области. "
Однако затем я сталкиваюсь с проблемой, что сущность с частными сеттерами, такая как:
public class Phrase
{
    public int PhraseId { get; private set; }
    public string PhraseText { get; private set; }
}

не может быть сериализовано в JSON из представления в контроллер (с использованием ASP.NET MVC). Это связано с частным сеттером.

Как вы разрешите сериализацию с частными сеттерами?

Ответы [ 3 ]

1 голос
/ 19 января 2009

Я не знаю, можно ли переопределить процесс десериализации с помощью MVC, но учтите, что DataContractSerializer поддерживает непубличные средства доступа, и существует версия JSON: DataContractJsonSerializer - возможно, стоит смотреть?

Лично я бы просто принял общедоступный установщик в этом случае ... это довольно распространенная особенность .NET DTO и сериализации на основе .NET. Неизменяемый / фабричный шаблон, хотя и является обычным явлением в Java, на самом деле не так уж распространен в .NET; Я не могу сказать, что возражаю против этого.

1 голос
/ 22 января 2009

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

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

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

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

1 голос
/ 19 января 2009

Вы всегда можете переопределить сериализацию или просто написать свой собственный метод десериализации JSON. Я лично думаю, что это не стоит усилий. Просто сделайте сеттер публичным и покончите с этим. Какой частный сеттер действительно покупает тебя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...