Соглашение об именах для дочерних объектов ViewModel

Я создаю приложение ASP.Net MVC, используя подход ViewModel, чтобы объекты моего домена были отделены от «моделей», используемых моим пользовательским интерфейсом. Я использую следующее соглашение для именования классов ViewModel. ViewModelName = ViewName + "ViewModel". Например:

Index + ViewModel = IndexViewModel

Пока все хорошо, это довольно распространенный шаблон, и есть много рекомендаций по этой теме на StackOverflow и в других местах. Мой вопрос касается дочерних объектов, используемых моими ViewModels. Если для моей ViewModel требуется класс со свойствами, идентичными моему объекту модели предметной области, я просто включаю модель предметной области в мою ViewModel. Например:

public class PersonViewModel
{
    public int PersonID { get; set; } 
    public Address Address { get; set; }
    public string SomeOtherProperty { get; set; }
}

Однако я не уверен, какое соглашение об именах использовать, когда мне нужен дочерний объект с другими свойствами из моей модели предметной области. Например, если Address требуется несколько дополнительных свойств, помимо того, что есть в модели домена Address, как я должен это назвать? Я считал AddressViewModel так:

public class PersonViewModel
{
    public int PersonID { get; set; } 
    public AddressViewModel Address { get; set; }
    public string SomeOtherProperty { get; set; }
}

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

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


person Louise Eggleton    schedule 15.09.2013    source источник
comment
Мой личный подход отличается. Я не называю ViewModels на основе имени View, я на самом деле называю их на основе моделей, которые они представляют. Однако для вашего конкретного подхода я бы также назвал Адрес с Адресом.   -  person Hugo Hilário    schedule 16.09.2013
comment
Лично я не использую суффикс, я создаю новую папку для своих моделей просмотра. Если объекты моего домена находятся в другой dll, я использую папку моделей и вместо этого создаю свои объекты пользовательского интерфейса. Я также делаю модели представления ответственными за преобразование себя обратно в сущности предметной области путем неявной перегрузки оператора, чтобы снять тяжелую нагрузку с контроллера.   -  person Slicksim    schedule 16.09.2013
comment
@shaftpolls, не приведет ли это к конфликту имен, если и адрес модели предметной области, и адрес модели представления используются в одном и том же файле. например, оба находятся в одном контроллере. Полагаю, я мог бы полностью квалифицировать каждый вариант Address с полным пространством имен, но это был бы PITA. Однако, как вы предположили, я склоняюсь к идее использовать то же соглашение об именах для дочерних объектов в моделях представления, что и в моделях моей предметной области.   -  person Louise Eggleton    schedule 16.09.2013
comment
Я считаю, что у вас не будет таких проблем, поскольку, когда вы ссылаетесь на адрес viewModel, вы сначала будете ссылаться на сам ViewModel. например personViewModel.Address. Если мой первый комментарий был полезен, я поставлю его в качестве ответа, если вы согласны.   -  person Hugo Hilário    schedule 16.09.2013
comment
@shaftpolls Я говорил не об имени свойства, а о классе. Если я уже использовал Address в качестве класса в моей модели предметной области, то могут возникнуть коллизии, если я также использую Address для имени класса, который является дочерним объектом модели представления.   -  person Louise Eggleton    schedule 16.09.2013
comment
О, хорошо, я понимаю. На самом деле то, что я использую для классов, унаследованных от моей модели предметной области, - это что-то вроде AddressExt. Я не использую ViewModels внутри ViewModels. Так что внутри ViewModel у меня будет AddressExt.   -  person Hugo Hilário    schedule 16.09.2013
comment
@shaftpolls Что вы будете делать, если вам нужно, например, представить объект в ViewModel, который не совсем такой же, как ваша модель предметной области?   -  person Louise Eggleton    schedule 17.09.2013
comment
Когда я создаю класс, который наследуется от одного объекта модели предметной области, я вызываю его (например, AddressExt), так что это имя я использую внутри своей ViewModel.   -  person Hugo Hilário    schedule 17.09.2013


Ответы (1)


Я собираюсь ответить на этот вопрос только потому, что ни у кого другого нет! (Я знаю, что немного опоздала на эту вечеринку!)

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

Если ваше соглашение об именах заключается в добавлении суффикса классов модели пользовательского интерфейса с помощью «ViewModel», тогда дочерние модели должны иметь такой же суффикс, иначе вы нарушите собственное соглашение!

Также допустим, что у вас есть таблица адресов (или что-то еще, что у вас есть), и у клиента может быть адрес, а у компании есть адрес, и они оба используют одну и ту же таблицу, тогда вы можете использовать одну и ту же дочернюю модель для обеих родительских моделей. Кажется правильным иметь AddressViewModel. Однажды у вас может быть View/PartialView, и это модель IEnumerable<AddressViewModel>

Я знаю, что на этот вопрос нет правильного ответа, но это мой ответ :-)

person matt_lethargic    schedule 05.06.2014
comment
Да, по большей части я тоже пришел к такому выводу, хотя приведенный мной пример, адрес, является плохим примером, потому что обычно, если у меня есть объект адреса, я сглаживаю его для моей модели просмотра. Так что на самом деле это означает, что количество дочерних моделей представления, которые я использую, меньше, чем когда я писал этот вопрос. В настоящее время я обычно использую дочерние модели представления, чтобы инкапсулировать аспекты представления, которые отличаются от основного содержимого представления. Все остальное, что является моделью в основной модели, сглаживается. - person Louise Eggleton; 05.06.2014