czy to jest dobre podejście?
Nie. Jest po prostu najbardziej popularne, bo wszyscy kopiują te same, idiotyczne tutoriale.
mnie kiedyś uczono przy projekcie web api (rest), że controller, czyli w pewnym zasadzie już coś bardzo blisko clienta nie ma prawa w ogole wiedzieć o istnieniu repozytorium
Tak.
dla mnie zawsze dobrą praktyką było trzymanie warstwy DAO zaraz przy warstwie klas domenowych (tych wykorzystywanych w DBSet<T>).
To nie są klasy domenowe tylko persistence modele.
dopiero serwis pukał do DAO o dostęp do danych - serwis też nie znał konkretnej bazy danych
Tak.
z kolei do serwisów pukał controller - ten zaś znał jedynie interfejsy serwisów
zawsze to robiłem w ten sposób, że w warstwie serwisów tworzyłem serwisy (internal) - do tego publiczne interfejsy,
A po co właściwie serwisom interfejsy?
tam jakąs klasę mającą dostęp do kontenera IOC (czy to jest fasada?) -
przy pierwszym wywołaniu rejestrował wszystkie serwisy wraz z interfejsami, a przy zapytaniu o okreslony interfejs (np. IUsersService) zwracał UsersService
Owrapowałeś kontener IoC? Czyli zrobiłeś jakiś service locator?
więc controller nawet nie wiedział o kontenerze IOC
Ale do tego nie trzeba jakichś karkołomnych konstrukcji. Każdy sensowny kontener IoC udostępnia biblioteczkę pozwalającą na integrację z webapi. A jeśli nie, to wystarczy napisać własne controllerfactory.
controller wiedział tylko CO może zrobić serwis danego interfejsu (nie wiedział jak)
Interfejs niczego w tej kwestii nie zmienia, kontroler i tak nie wie, co się dzieje w metodach innych klas.
Już pal licho czy mamy tą warstwę DAO. według wielu jest to nadmiarowe, przecież sam ORM jest w pewnym sensie tym DAO, a my to jeszcze bardziej opakowujemy,
chociaż gdyby przyszło nam zmieniać naglę bazę przykładowo z msSQL na oracle (wiem że to bardzo mało realne) to wtedy wystarczy przeorać warstwę DAO
A mając tylko ORM wystarczy zmienić connection string.
Ale koniec końców nawet bez dodatkowej abstrakcji w postaci warstwy DAO, to czy odwołania się do repozytorium są dopuszczalne w warstwie controllera ?
Może tak to się robi w tym czystym MVC (nie w WEB API)?
Tak się robi, bo programowaniem zajmuje się masa dyletantów, która umie jedynie kopiować kod z indiańskich tutoriali.