В моем приложении ASP.NET у меня есть Person
и PersonViewModel
.
Мой Person
был сгенерирован LinqToSql
. У него есть свойства, которые будут сохранены в базе данных.
В моем PersonViewModel
есть все, что есть у Person
, плюс пара «списков выбора», которые будут использоваться для заполнения полей со списком, а также FormattedPhoneNumber
(в основном это PhoneNumber
с тире и круглыми скобками). добавленный).
Первоначально я просто сделал Person
свойством для PersonViewModel
, но я думал, что это означало бы, что страница должна будет "знать", является ли что-то Person
свойством или PersonViewModel
свойством. Например, для имени представление будет запрашивать pvm.Person.Name
, но для номера телефона представление будет запрашивать pvm.FormattedPhoneNumber
. Если я использую наследование, то все, что нужно представлению, всегда будет прямым свойством модели представления, поэтому pvm.Name
.
Это звучит замечательно, но здесь нет настоящих отношений "есть" (то есть, я не думаю, что имеет смысл говорить: "PersonViewModel
- это a Person
), и это, кажется, идет вразрез с «предпочтением композиции перед наследованием». Тем не менее, мне трудно думать о сценарии, в котором мне понадобится возможность поменять Person
на что-то другое. Если я это сделаю это больше не будет PersonViewModel
.
Что скажете вы? Унаследовать от Person
или оставить Person
как свойство (или что-то еще целиком)? Почему?
Обновление
Спасибо за все ответы.
Похоже, что идея наследования была почти повсеместно отвергнута, и по некоторым веским причинам:
Разделение классов позволяет ViewModel
содержать только требуемых свойств модели домена и любые дополнительные свойства. С помощью наследования вы, естественно, предоставляете все открытые свойства из модели предметной области, что может быть не очень хорошей идеей.
ViewModel
не нужно автоматически менять только потому, что изменилась модель домена.
Как уже упоминал Джей, разъединение ViewModel
облегчает проверку для конкретного вида.
Как упоминал Киет, использование Mapper (например, AutoMapper) может избавить вас от утомительной работы по сопоставлению общих свойств между классами.