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

questionAnswers(3)

yourAnswerToTheQuestion