to bardzo bym chciał zobaczyć kod niezjebanej aplikacji .net z dobrym DDD ;)
Ja też. Tzn. może nie "bardzo", bo dla mnie DDD to głównie buzzwordowa ciekawostka, która w praktyce nie istnieje chyba nigdzie. Ale jakby ktoś kiedyś zrobił taki projekt dobrze, to przynajmniej miałbym co linkować w takich sytuacjach. :)
DDD ma sens w przypadku skomplikowanych części modelowanego biznesu. Tymczasem większość operacji w typowych aplikacjach to zwykły CRUD. Niestety, niektórzy na siłę próbują robić CRUD za pomocą DDD, i wychodzi z tego straszny przerost formy nad treścią.
wracając do wstrzykiwania serwisów do kontrolera, z reguły zawsze mam repozytoria powiązane z encją i wstrzykuje do kontrolera to co mi potrzeba, ale zgodnie z SRP powinienem wstrzykiwać tylko jedno repo/serwis? nigdy jeszcze tak nie miałem, żeby ta jedna wstrzyknięta zależność mi wystarczała, bo zawsze w jakiejś akcji zrobić/sprawdzić coś jeszcze trzeba a jak nie w akcji to w serwisie aplikacji, a to kolejna rzecz, która trzeba do kontrolera wstrzyknąć.
Trzeba wstrzykiwać tyle, ile potrzeba, ale nie sądzę, żeby kontroler potrzebował więcej niż kilku zależności. To serwisy mogą mieć więcej zależności (od innych serwisów), i logika serwisu powinna zajmować się sprawdzaniem i robieniem "czegoś jeszcze". Kontroler ma zebrać dane, wywołać serwis, odebrać wynik, i przekierować do innego widoku albo wyświetlić błąd. Tyle.
No, a przede wszystkim, jeśli wstrzykujesz do kontrolera UoW albo repozytorium, to nie masz ani DDD, ani MVC.
fakt faktem na początku też korzystałem z opcji, że wstrzykiwałem tylko klasę (UnitOfWork), a w niej miałem wszystkie repozytoria, czy wtedy już jest to SRP?
Jeśli w UoW masz repozytoria, to masz kupę trudnego w utrzymaniu kodu i złamanie OCP. (Bo dodanie nowego repozytorium powoduje zmiany w niezależnym od niego UoW.)
ogólnie przy repozytoriach generycznych uważam, że serwisy nie są głupimi nakładami, bo pozwalają odpowiednio przygotować dane do metody z repozytorium.
Ale tu nad repozytorium generycznym są repozytoria niegeneryczne, a dopiero z nich korzystają serwisy, a dane są odpowiednio przygotowywane i tak w kontrolerze.
Powinno być tak, że kontroler zbiera dane z widoku, wysyła viewmodel do serwisu, a serwis:
a) W prostym przypadku - przetwarza te dane, i aktualizuje bazę za pomocą ORMa.
b) W skomplikowanym przypadku (przy podejściu DDD) - woła serwis domenowy, który za pomocą odpowiednich metod operuje na aggregate rootach, które odpowiednio delegują te operacje do swoich encji, a następnie wywołuje repozytorium w celu zachowania zmian. W tym podejściu encje oczywiście są prawdziwymi encjami, czyli klasami z zachowaniem, a nie modelami wiersza tabeli z ORMa, zawierającymi jedynie publiczne właściwości.
skoro repozytoria w ogóle nie powinny być generyczne to artykuły na asp.net mijają się z prawdą m.in właśnie o generycznym repo?
Generyczne repozytorium to może być niepubliczna bazowa klasa abstrakcyjna dla prawdziwych repozytoriów. Ale tylko pod warunkiem, że projekt jest zgodny z DDD i występują w nim repozytoria.
Tymczasem powszechnie mianem "generycznego repozytorium" nazywa się tak naprawdę generyczny data mapper, który z repozytorium nie ma nic wspólnego.