Gdzie trzymać viewmodele?

0

Moja architektura wygląda tak:

Projekt Web zawiera widok MVC i kontrolery WebAPI, które coś zwracają i coś przyjmują.
Projekt Domain zawiera model domenowy
Projekt Core zawiera DTO z mikroserwisów i serwisów,z którymi się komunikuje

I teraz gdzie umieścić view modele?

  1. W projekcie Web i tam mapować domene do viewmodeli - jest to tylko dla prezentacji i odbierania danych
  2. W projekcie Core i z serwisów do kontrolerów WebApi zwracać już viewmodele - serwisy będą operować na domenie, viewmodelach i DTO

Co polecacie? Jakie jest wasze zdanie? Może jest jakiś standard?

1

Serce i doświadczenie podpowiadają że View modele powinny być tam gdzie view czyli w Projekcie Web.

0

Jak dla mnie viewmodele to kontrakty łączące warstwę webową z aplikacją, czyli jakimiś serwisami, które te viewmodele produkują, czy to z innych serwisów, czy to z encji domenowych, czy to pobierają z bazy.
Dlaczego tak? Bo dla warstwy prezentacji nie powinno mieć znaczenia, czy viewmodel pochodzi z własnej bazy aplikacji czy z zewnętrznego serwisu.

Tak więc, jak dla mnie to u Ciebie brakuje jednej warstwy-projektu między Domain/Core a Web. Przy czym ja też nie nazwałbym projektu Core w ten sposób, skoro to nie jest żaden rdzeń a jedynie warstwa integracji z innymi systemami.

0

Teoretycznie można zrobić tak jak napisał @somekind chociaż muszę się z tym nie zgodzić. ViewModel'e są powiązane z warstwą prezentacji (View) a więc często spotykaną praktyką z którą i ja się zgadzam jest umieszczanie ich w projekcie Web. Jest to tym bardziej logiczne że (przynajmniej w ASP) właściwości modeli oznaczamy atrybutami określającymi pewne zachowania z których widok bezpośrednio korzysta, np. walidacja.

0

ViewModele są używane przez warstwę prezentacji, co nie znaczy, że muszą się znajdować wewnątrz niej. Umieszczenie viewmodeli w projekcie webowym zazwyczaj kończy się tym, że aplikacja staje się jednowarstwowa. Bo mapowanie z "encji" czy modeli bazodanowych też wtedy musi się znaleźć w web, a to już jest strasznie słabe.
Aby tego nie skopać, należałoby mieć oddzielne DTO do komunikacji między aplikacją a prezentacją, następnie mapowane na wewnętrzne viewmodele. Jak dla mnie, to rzadko ma sens, bo trzeba utrzymywać oddzielną warstwę DTO i mieć dwie warstwy mapowania zamiast jednej. Dlatego ja preferuję uproszczoną architekturę, w której DTO wędrujące z aplikacji do prezentacji są od razu view modelami.
Walidacja to nie problem, bo można np. umieścić w metaklasie albo w ogóle użyć jakiegoś bardziej zaawansowanego rozwiązania niż standardowe atrybuty.

0

Fakt, w Web mam referencje do Domeny by zmapować ViewModele w tą lub drugą stronę.

Architekturę mam taką, że:
W projekcie Domain leżą POCO i interfejsy serwisów i repozytoriów(to chyba jest błąd)
W projekcie Core leżą implementacje interfejsów z Domain - czyl integracja z EF, mikroserwisami
W projekcie Web leżą ViewModele, którę zwracam za pomocą WebAPI

1 użytkowników online, w tym zalogowanych: 0, gości: 1