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

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

Должен ли я:

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

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

Я знаю, что 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)

Есть мысли?

Ответы [ 2 ]

2 голосов
/ 07 декабря 2009

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

1 голос
/ 07 декабря 2009

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

* 1003 Е.Г. *

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

    // ...
}
...