Если мне нужно извлечь объект из связующего элемента пользовательской модели, должен ли связующий элемент взаимодействовать с уровнем сервиса, уровнем хранилища или ...?
-
12-09-2019 - |
Вопрос
Если у меня есть класс, похожий на этот:
public class Person
{
public string firstName { get; set; }
public string lastName { get; set; }
public Pet myPet { get; set; }
}
Когда я создаю пользовательскую модель binder, сообщение из моей формы не будет отправляться в виде Pet, оно будет отправлять данные, подобные этому:Имя пользователя:"Мое первое имя" Фамилия:"Мое последнее имя" моего питомца:"Имя моего файла"
Поскольку передается имя питомца, а не сам объект Pet, объект Pet необходимо извлечь из model binder.
Мой вопрос в том, должен ли model binder взаимодействовать с уровнем сервиса, уровнем хранилища или он даже должен извлекать Pet?Проблема с уровнем сервиса заключается в том, что у меня, похоже, нет доступа к ModelState при инициализации сервиса:((this.ModelState) выдает мне ошибку)
_petService = new PetService(new ModelStateWrapper(this.ModelState));
Если мне нужна привязка модели для создания объекта Person, то Питомцу нужно было бы как-то назначить...как я должен это сделать?
Решение
Что я делаю, так это использую модель представления вместо привязки к бизнес-объектам.Помните, что ваши пользователи могут вводить недопустимые значения, и вам нужно будет повторно отобразить эти недопустимые значения пользователю, предлагая ему исправить свои ошибки.Но ваши "реальные" бизнес-объекты, вероятно, не будут принимать недопустимые значения.Таким образом, модель представления должна допускать любой пользовательский ввод, даже ввод, который бизнес-объекты не будут принимать.
Это упрощает привязку.Вам не нужно обращаться к репозиторию для привязки, только при обновлении бизнес-объекта с помощью (допустимого) пользовательского ввода.