Jak planujesz architekturę aplikacji internetowej MVC na dużą skalę, w jaki sposób wdrażasz warstwy, aby były możliwie jak najbardziej rozdzielone i łatwe do przetestowania? (w zasadzie postępuj zgodnie z najlepszymi praktykami) Powiedzmy, że najpierw używam kodu jako dostępu do danych.
Mam problem z tym, co zdefiniować jako „logikę biznesową” i jak ma ona oddziaływać z warstwą danych. Biorąc za przykład aplikację do sprzedaży pojazdów, czy logika biznesowa byłaby klasami wykonującymi zadania, takie jak obliczanie zakresu podatkowego dla danych pojazdów, porównywanie statystyk mil na galon itp.? Jeśli chodzi o podmioty gospodarcze (np. Samochody osobowe, dostawcze, motocykle), umieściłbym je w warstwie danych wraz z moją DataContext
klasą.
Co też stanowiłoby logikę aplikacji w przeciwieństwie do biznesu - zgaduję takie rzeczy jak weryfikacja danych wejściowych sesji / użytkownika?
Na przykład kontroler samochodowy może zwrócić wynik działania / widoku, który zawiera listę dziesięciu najlepszych samochodów filtrowanych według typu i najlepszego mpg. Powiedzmy, że mam ICarRepository
„carRepo” wstrzyknięty do mojego kontrolera (używając wzorca repozytorium / DI), filtruję moje samochody na podstawie parametru metody akcji, np.var cars = carRepo.getCarsByType("hatchback");
Więc trzymałem wiedzę o dostępie do danych poza moim kontrolerem za pomocą repozytorium, teraz, aby utrzymać logikę biznesową poza kontrolerem za pomocą modelu domeny - var result = new MpgCalculator (samochody); - Powiedzmy, że potrzebuję klasy kalkulatora, ponieważ musi ona wykonać dodatkową logikę, aby obliczyć najlepszą efektywność paliwową, więcej niż tylko ładowanie / filtrowanie jednostek z bazy danych. Mam teraz zestaw danych do renderowania, który używał repozytorium do pobierania z warstwy dostępu do danych, oraz obiekt specyficzny dla domeny do przetwarzania i wykonywania zadań związanych z biznesem na tych danych.
Czy popełniam tutaj błędy? czy nadal musimy używać wzorca repozytorium, czy mogę po prostu kodować interfejs, aby oddzielić ORM i przetestować? W tym temacie, ponieważ moje konkretne klasy danych dostępu do kontekstu dbcontext znajdują się w warstwie danych, czy definicje interfejsu powinny przejść do warstwy domeny / biznesu, co oznacza, że jeśli technologia dostępu do danych zostanie kiedykolwiek zmieniona, moje pozostałe warstwy nie zostaną zmienione?
Z tego, co dotychczas studiowałem, moja struktura wygląda następująco:
Aplikacja internetowa MVC -> Standardowy projekt internetowy - modelami tutaj są ViewModels
Domena / warstwa biznesowa -> klasy / modele specyficzne dla biznesu, których kontrolery mogą używać do przetwarzania jednostek domeny z warstwy danych przed przejściem do odpowiednich widoków
Czy konieczna jest abstrakcja repozytorium? -> Słyszę wiele debat na ten temat, zwłaszcza gdy używam ORM
Warstwa danych -> Klasy jednostek (samochód, furgonetka, motocykl), DbContext - konkretna warstwa technologii dostępu do danych