Jak obsługiwać model widoku z wieloma zagregowanymi pierwiastkami?
W tej chwili mam dość kiepski model widoku.
Klasy wyglądają tak: =>
public class AccountActionsForm
{
public Reader Reader { get; set; }
//something...
}
Problem polega na tym, że typ czytnika pochodzi z modelu domeny (naruszenie SRP).
Zasadniczo szukam wskazówek projektowych (tj. Czy dobrym pomysłem jest podzielenie modelu widoku na wejścia / wyjścia?), W jaki sposób sprawić, aby mój model widoku był mniej obciążony i przyjazny dla programisty (tj. - mapowanie powinno działać automatycznie przy użyciu klasy bazowej kontrolera) ?
Jestem świadomy struktury AutoMapper i prawdopodobnie go użyję.
Więc jeszcze raz - jakie są wspólne zasady podczas tworzenia właściwego modelu widoku? Jak go ustrukturyzować? Jak mapowanie jest wykonywane, gdy konieczne jest wprowadzenie wielu obiektów domeny?
Jestem zdezorientowany w przypadkach, gdy widok potrzebuje danych z więcej niż 1 agregowanego roota. Tworzę aplikację, która ma elementy takie jak Library, Reader, BibliographicRecord itp.
W moim przypadku - na poziomie domeny nie ma sensu grupować wszystkich tych 3 typów wLibraryReaderThatHasOrderedSomeBooks
lub co, ale widok, który powinien wyświetlać listę zamówionych książek dla konkretnego czytelnika w określonej bibliotece, wymaga ich wszystkich.
Więc - wydaje się dobrze tworzyć widokOrderedBooksList
zOrderedBooksListModel
zobacz model poniżej, który trzymaLibraryOutput
, ReaderOutput
iBibliographicRecordOutput
przeglądaj modele. Albo nawet lepiej -OrderedBooksListModel
zobacz model, który wykorzystujetechnika spłaszczania i ma rekwizytyReaderFirstName
, LibraryName
itp.
Ale to prowadzi do problemów z mapowaniem, ponieważ istnieje więcej niż jedno wejście.
To nie jest już relacja 1: 1, w której kopie tylko jeden zagregowany root.
Czy to oznacza, że mój model domeny jest w błędzie?
A co z wyświetlaniem pól modelu, które żyją wyłącznie na warstwie interfejsu użytkownika (tj. Enum wskazującego zaznaczoną kartę)?
Jestto co wszyscy robią w takich przypadkach?
FooBarViewData fbvd = new FooBarViewData();
fbvd.Foo = new Foo(){ A = "aaa"};
fbvd.Bar = new Bar(){ B = "bbb"};
return View(fbvd);
Nie chcę tego robić =>
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);
Wydaje się, że jest dużo pisania. :)
Czytając to w tym momencie. Ito.
Dobrze. Dużo myślałem o tym problemie i tak - dodanie kolejnej warstwy abstrakcji wydaje się rozwiązaniem =>
alt tekst http://i46.tinypic.com/fe14qp.jpg
Więc - moim zdaniem to już działa, teraz nadszedł czas na trochę bawienia się.
ty Jimmy