W dzisiejszej podróży autobusem naszła mnie lekka retrospektywa, mianowicie zauważyłem, że od pewnego czasu we wszystkich moich aplikacjach typowo biznesowych (jakiś GRUD + logika w zależności od klienta), przyjmuje stałą, jednakową strukturę projektu. Jest mi z nią dobrze, przyzwyczaiłem się i do dziś uważałem ją za jedyną słuszną, ale tak sobie jadąc pomyślałem, że może jednak nie jest ona taka idealna jak sobie wyobrażam. Jako, że staram się przywiązywać wagę do czytelności kodu i architektury programu pomyślałem, że co mi szkodzi, założę nowy temat :)
A więc chciałbym przypomnieć na starcie, że mówimy o typowo biznesowych rozwiązaniach, miejmy na uwadze, że zazwyczaj w tego typu aplikacjach liczy się czas realizacji (ja wiem, że zawsze można się czegoś doczepić, ale bądźmy w miarę wyrozumiali).
A więc moja struktura projektu wygląda następująco:
|-> Project.Base
|------> Project.Base.Model
(klasy POCO, zwykle odwzorowanie relacji w bazie danych)
|------> Project.Base.Repository
(interfejsy repozytorium)
|------> Project.Base.Service
(interfejsy usług/logik biznesowych)
|------> Project.Base.Manager
(interfejsy menedżerów, mam na myśli jakiś mechanizm silnie powiązany z jakąś technologią, np. uwierzytelnianie, czy
| jakieś ładnie opakowane mechanizmy typowo SharePoint, CRM, itp).
|-> P0roject.SQL.Repository
|------> Implementacja repozytorium dla SQL
|-> Project.CRM.Repository
|------> Implementacja repozytorium dla CRM
|-> Project.Something.Repository
|-------> Implementacja
|-> Project.Service
|-------> Implementacja service/logic - zwykle są to bezstanowe logiki, ale zdarzają się wyjątki od reguły (rzadko), niezależne od technologii
|-> Project.Manager
|-------> Implementacja managerów (np. uwierzytelnianie w ASP.NET przy pomocy cookie, itp.)
|-> Project.ViewModel
|-------> Klasy POCO, które są używane przez moją warstwę UI
|-> Project.Configuration
|-------> Ten projekt ma odwołania do wszystkich powyższych projektów, i ot tutaj znajduje się konfiguracja jakiegoś DI/IoC
|-> Project.Controller
|-------> Tutaj w zależności od aplikacji znajduje się implementacja kontrolerów/prezentereów (jak zwał tak zwał)
|-> Project.UI
|-------> Implementacja GUI korzystająca z Project.ViewModel
Największy problem mam z tym czy warstwa Project.Service
powinna zwracać encje z Modelu czy ViewModelu, myślałem nad tym i powiem szczerze nie wiem. Nie ukrywam, że zwracanie ViewModeli
z warstwy Service
jest bardzo wygodne, korzystam z kilku repozytorium i sklejam całość w jeden ViewModel
, przez co akcje kontrolera są bardzo czytelne, z drugiej strony uzależniam wtedy logikę/serwisy od konkretnej postaci ViewModeli. Co myślicie, które rozwiązanie lepsze? Co tu poprawić? Jakieś uwagi?