Используя MS MVC и DDD, как и где определить класс параметров MVC ActionMethod, который включает в себя сущность, объект value и несколько дополнительных полей?

StackOverflow https://stackoverflow.com/questions/1858199

Вопрос

Я как раз на грани того, чтобы воскликнуть "Ах-ХА!", когда дело доходит до кодирования Дизайна, ориентированного на домен.Вопрос в том, Как и где определить класс параметров MVC ActionMethod, который включает в себя сущность, объект value и несколько дополнительных полей? Классы объектов entity и value определены в моем репозитории.

Должен ли я:

  1. Создать пользовательский класс в репозитории, реализующий другие классы (чтобы получить свойства всех в одном классе), и добавить еще несколько свойств для дополнительных полей?
  2. Создайте классы объекта entity / value poco в репозитории и создайте составной класс, ссылающийся на эти объекты в моем классе контроллера, затем используйте это как тип параметра ActionMethod?
  3. Что-то еще?

Форма запроса просто содержит несколько полей класса клиента, почтовый адрес и несколько особенностей формы, например, как они нас нашли.Контент не важен, важно только то, что он содержит информацию из нескольких poco.

Я знаю, что MVC будет сопоставлять поля опубликованной формы со свойствами Poco в параметре ActionMethod следующим образом:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult RequestCatalog()

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(Customer customer)

Таким образом, customer.FirstName автоматически привязывается к FirstName в опубликованной форме.

У меня есть следующее:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(string fname, string lname, string address,
    string city, string state, string zip, string phone, string howTheyFoundUs)

Но хотите иметь что-то вроде:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog( RequestForm requestForm)

Есть какие-нибудь мысли?

Это было полезно?

Решение

Прежде всего, вы должны понимать, что Модель предметной области должна быть определена независимо от среды выполнения (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; }
}

и класс адресов определяется аналогично.

Теперь вопрос, который вам нужно задать себе (или любому Эксперту в предметной области, с которым вы работаете).:Делает ли howTheyFoundUs принадлежите к классу Клиентов?Или это концепция предметной области сама по себе?Или это действительно просто фрагмент данных для конкретного приложения, который вообще не имеет никакого отношения к модели предметной области?Ответы на такие вопросы помогут вам в конечном итоге смоделировать свои входные данные.

Кроме того, приведенное выше свойство Phone кажется мне сомнительным, но это довольно хороший пример того, как детали реализации (в данном случае ASP.NET MVC) могут просочиться в модель.

Номер телефона действительно должен быть объектом-значением сам по себе (см. это сообщение в блоге для соответствующего рассмотрения этой темы), но ModelBinder по умолчанию для ASP.NET требует примитивного типа.Лучшим вариантом было бы реализовать пользовательский ModelBinder, который может преобразовывать номер телефона в соответствующий объект.

Другие советы

Ничто не мешает вам использовать запрос.Форма в вашем методе действия.

Например.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult RequestCatalog(Customer customer)
{
    var howTheyFoundUs = Request.Form["howTheyFoundUs"];

    // ...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top