На данный момент у меня довольно плохо модная модель.
Классы выглядят так =>
public class AccountActionsForm
{
public Reader Reader { get; set; }
//something...
}
Проблема в том, что тип Reader основан на модели домена (нарушение SRP).
По сути, я ищу советы по проектированию (т. Е. Является ли хорошей идеей разделить модель представления на входы / выходы?), Как сделать мою модель представления менее удобной и удобной для разработчика (т.е. отображение должно работать автоматически с использованием контроллера базовый класс)?
Я знаю об инфраструктуре AutoMapper и, вероятно, собираюсь ее использовать.
Итак, еще раз - каковы распространенные ошибки при попытке создать правильную модель вида? Как это структурировать? Как выполняется сопоставление при необходимости ввода нескольких доменных объектов?
Меня смущают случаи, когда для просмотра требуются данные из более чем одного совокупного корня. Я создаю приложение, в котором есть такие объекты, как Library, Reader, BibliographicRecord и т. Д.
В моем случае - на уровне домена нет смысла группировать все эти 3 типа в LibraryReaderThatHasOrderedSomeBooks
или еще много чего, но для просмотра, который должен отображать список заказанных книг для конкретного читателя в конкретной библиотеке, нужны все они.
Итак, кажется, что можно создать вид OrderedBooksList
с моделью вида OrderedBooksListModel
, которая содержит модели вида LibraryOutput
, ReaderOutput
и BibliographicRecordOutput
. Или еще лучше - OrderedBooksListModel
просмотр модели, которая использует метод сплющивания и имеет реквизиты типа ReaderFirstName
, LibraryName
и т. Д.
Но это приводит к проблемам с отображением, поскольку существует более одного входа.
Это больше не соотношение 1: 1, где я бью только в один агрегированный корень.
Означает ли это, что моя модель домена является неправильной?
А как быть с полями модели представления, которые находятся исключительно на уровне пользовательского интерфейса (т. Е. Enum, указывающий на отмеченную вкладку)?
Является ли этим , что каждый делает в таких случаях?
FooBarViewData fbvd = new FooBarViewData();
fbvd.Foo = new Foo(){ A = "aaa"};
fbvd.Bar = new Bar(){ B = "bbb"};
return View(fbvd);
Я не хочу этого делать =>
var fbvd = new FooBarViewData();
fbvd.FooOutput = _mapper.Map<Foo,FooOutput>(new Foo(){ A = "aaa"});
fbvd.BarOutput = _mapper.Map<Bar,BarOutput>(new Bar(){ B = "bbb"});
return View(fbvd);
Кажется, я много пишу. :)
Чтение этого в данный момент. И это .
Ok. Я много думал об этой проблеме, и да - добавление еще одного слоя абстракции кажется решением =>
Итак - по-моему, это уже работает, теперь пришло время немного поиграть.
ты Джимми