9

W mojej aplikacji ASP.NET MVC mam dość złożoną stronę edycji, która łączy wiele modeli w jeden widok.ASP.NET MVC - Czy powinienem użyć wzorca repozytorium do napisania ViewModels do bazy danych lub przekonwertowania ich na modele?

Używam wzorca ViewModel do łączenia wszystkich tych informacji i przedstawienia jednego spójnego obiektu do widoku.

Jako przykład, mój ViewModel struktura jest mniej więcej tak:

CompanyId 
CompanyName 
List<Employee> Employees 
List<ContactMethod> ContactMethods 

Przedmiotem Pracownik ma kilka podstawowych właściwości oraz preferowaną metodę kontaktu.

Na stronie edycji użytkownik otrzymuje wszystkich pracowników firmy, którzy mogą dodawać i usuwać (przy użyciu javascript), a także edytować dane pracowników. Lista ContactMethods służy do wypełniania listy rozwijanej dla każdego pracownika.

Z powodzeniem przetłumaczyłem moje modele (przeczytane z bazy danych) na ten ViewModel iz powrotem, więc po edycji pozostało mi ViewModel reprezentujący aktualny stan pracowników tej firmy.

używam repozytorium wzór do komunikowania się z bazą danych, więc moje pytanie brzmi, powinienem zadzwonić bezpośrednio do CompanyRepository, przechodzącej ViewModel, czy powinienem konwertować ViewModel z powrotem do modelu obiektów pierwszy przed użyciem repozytorium zapisać je w bazie danych?

W skrócie, , czy repozytorium powinno wiedzieć o moich obiektach ViewModel?

Odpowiedz

13

Najpierw przekonwertowałbym ViewModel na obiekty modelu. Lubię utrzymywać zależność między moją warstwą WWW a warstwami repozytoriów tak luźno, jak to tylko możliwe.

Nie sądzę, że Twoje repozytorium powinno wiedzieć o swoim ViewModelu, ponieważ jest to koncepcja na poziomie sieci.

+0

Jeśli tak jest (i to jest w porządku), muszę utworzyć te modele pracowników, usunąć wszystkich obecnych pracowników z tej firmy, a następnie dodać nowe modele pracowników ... lub ... pobrać wszystkie modele pracowników z bazy danych i dopasuj je przed dodaniem, usunięciem i edytowaniem w razie potrzeby. Czy to brzmi dobrze? – Damovisa

+0

@ Daamo: możesz to zrobić. Zamiast tego zachowałbym te informacje podczas edycji. W swoim ViewModelu zachowaj trzy listy: CreatedEmployees, EditedEmployees, DeletedEmployees. – manu08

+0

@ manu80 - Rozumiem, jak to może działać, ale może być nieco skomplikowane. Interfejs musiałby się trochę zmienić, aby uwzględnić te trzy kolekcje - nawet jeśli zmienia się tylko javascript. – Damovisa

4

ViewModel jest modelem dla widoku (UI), więc repozytorium nie powinno wiedzieć o modelu widoku. Rozdzielenie ich spowoduje luźne sprzężenie repozytorium z interfejsu użytkownika.

Użyj innej warstwy, na przykład warstwy usługi, do enkapsulacji repozytorium z interfejsu użytkownika. Ta warstwa wykonuje również konwersację ViewModel - Model i wywołuje repozytorium.

public class ServiceLayer 
{ 
    public void SaveModel(ViewModel viewmodel) 
    { 
     var model = viewModel.ToModel(); 
     repository.Save(model) 
    } 
} 
+0

Dlaczego usługa ServiceLayer zależy od modelu ViewModel? Zamiast tego wywołaj viewModel.ToModel w warstwie widoku, a następnie przekaż model do usługi. – manu08

+0

@Hery - Tak, to brzmi nieźle, ale byłoby o wiele więcej niż tylko przekazanie modelu do repozytorium. Modele pracowników mogą być nowe, zmienione lub usunięte. – Damovisa

+0

@manu: to tylko inny sposób implementacji, zależy od tego, jak chcesz obudować repozytorium z widoku. Ale mogę wymienić niektóre korzyści, takie jak: - Przeprowadzić niektóre walidacje biznesowe, które nie są objęte konwersją ToModel. - Zachowaj prosty i ogólny model repozytorium, podczas gdy warstwa usługi wykonuje bardziej szczegółowe zadania, które są powiązane z modelem podglądu tylko moje 2 centy :) – heisthedon

1

zgadzam się z poprzednią odpowiedzią przekształcania ViewModels powrotem do „zwykłych” modeli, ale byłoby dodać, że zadanie to powinno być prawdopodobnie przeprowadzone przez osobnej warstwie usług. Ta warstwa byłaby odpowiedzialna za zdemontowanie swoich ViewModels i działanie w odpowiedni sposób.

Jest to w istocie definicja usługi: coś, co ma za zadanie wykonać logiczną jednostkę pracy, która wymaga wielu modeli i/lub złożonej logiki.

+0

Myślę, że to dostosowanie powinno być oddzielne od kontrolerów, ale nie sądzę, że pasuje również do całkowicie oddzielnej warstwy. Jest to tylko koncepcja warstwy widoku i powinna w ogóle spaść na niższe warstwy. Możesz po prostu utworzyć Adaptery lub jakiś typ klasy pomocniczej w tej samej warstwie, co Kontrolery/widoki. Zapisałbym tę warstwę usługi (między warstwami repozytorium i widoku) w celu sprawdzania poprawności modeli. – manu08

Powiązane problemy