Proponuję zainteresować się tematem repozytorium generycznego w aplikacjach MVC, które to ma z reguły minimum 4 warstwy (model, data, obsługa serwisów i interfejs użytkownika). Implementacja aplikacji opartej na takim mechanizmie jest pracochłonna, jednak w przypadku większych projektów bardzo opłacalna, gdyż pozwala trzymać wszystko w ryzach.
Tylko co ma antywzorzec repozytorium generycznego do ilości warstw? To tylko klasa, można ją równie dobrze w jednowarstwowej aplikacji zaimplementować. I niczego nie utrzymuje w ryzach, zazwyczaj jedynie dodaje zbędny wrapper na coś, co już jest repozytorium generycznym.
Model czyli CRUD, obsługa serwisów, mapowania, encje etc... Chodzi o zrobienie projektu w ramach tej samej solucji co reszta i np. testowanie. Wydaje mi się lepszym wyjściem oddzielenie modelu, bo np. w testach to model będziesz dodawać do projektu z testami, a nie projekt z testami do całej aplikacji. Będzie większy porządek kiedy model będzie osobno - przynajmniej tak mi się wydaje. Wystarczy w sumie zrobić DLL'kę i dołączać gdzie potrzeba.
No i oczywiście, że tak.
Zresztą, model biznesowy powinien być w innym projekcie niż np. jakieś klasy mapujące ORMa, które są infrastrukturą. Ogólnie model nie powinien mieć w referencjach żadnych konkretnych bilbiotek infrastrukturalnych (ORM, logger, AOP, testowanie wydajności, diagnostyka, itp.).