Прежде всего вы должны понимать, что модель предметной области должна быть определена независимо от среды выполнения (MVC). Представьте себе, что в будущем вы сможете представить модель домена в качестве службы WCF, или расширенного клиента WPF / Silverlight, или пакетного задания, или чего-то еще ...
Это означает, что все моделирование должно быть не связано техническими деталями. То, как вы храните свои данные и особенности использования доменных объектов, должно (в значительной степени) игнорироваться на этом этапе процесса проектирования.
Вы всегда должны спросить себя: имеет ли этот класс смысл как часть чистого домена?
В вашем конкретном случае большинство ваших входных данных звучат так, как будто они принадлежат классу Customer со структурой, подобной этой
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public Address Address { get; set; }
}
и класс Address определяется аналогично.
Теперь вопрос, который вам нужно задать себе (или экспертам по доменам, с которыми вы работаете): howTheyFoundUs
относится к классу Customer? Или концепция домена сама по себе? Или это действительно просто часть данных, относящаяся к конкретному приложению, которая вообще не имеет ничего общего с моделью предметной области? Ответ на такие вопросы покажет, как вы в конечном итоге будете моделировать свой вклад.
Кроме того, приведенное выше свойство Phone кажется мне сомнительным, но является довольно хорошим примером того, как детали реализации (в данном случае ASP.NET MVC) могут просочиться в модель.
Телефонный номер должен действительно представлять собой объект-значение сам по себе (см. в этом сообщении в блоге , чтобы узнать, как с этим обращаться к этой теме), но ModelBinder по умолчанию в ASP.NET требует тип примитива. Лучшим вариантом было бы реализовать пользовательский ModelBinder, который может анализировать номер телефона в нужный объект.