2012-03-22 15 views
6

Mam repozytorium, które implementuje interfejs IRepository. Repozytorium wykonuje kwerendy w Entity Framework (w imieniu) aplikacji i bezpośrednio zwraca utworzony obiekt encji.Czy obiekty obiektu powinny być odsłonięte przez repozytorium?

Cały etap implementacji IRepository polega na tym, że w przyszłości może zostać zmieniony dla różnych repozytoriów. Jednak zwracanie dokładnych obiektów encji zwróconych przez Entity Framework złamie to. Czy to jest do przyjęcia?

Czy zatem repozytorium powinno konwertować wszystkie obiekty Entity Framework na obiekty biznesowe przed udostępnieniem ich aplikacji? Czy takie obiekty powinny implementować interfejs lub mieć wspólny typ podstawowy?

+1

Jakie "repozytoria" chciałbyś obsłużyć? Masz na myśli przejście z EF na NHibernate? W takim przypadku prawdopodobnie wystąpią o wiele więcej zmian niż interfejs IRepository. –

+0

Nie myślałem o niczym szczególnym, ale chcę, aby moja aplikacja była solidna. Jakie inne zmiany myślisz? –

Odpowiedz

10

Interfejs repozytorium powinno zajmować się tylko /podmiotów gospodarczych domen, to repozytorium wysyła i odbiera tylko obiekty znane przez aplikację obiektów, które nie są związane z realizacją dostępu peristence bazowego.

Encje EF lub Nhibernate modelują dane trwałości NOT domeny. Tak więc IRepository nie powinien zwracać obiektu będącego szczegółem implementacji ORM, ale obiekt, który może być używany bezpośrednio przez aplikację (obiekt domeny lub uproszczony model widoku, w zależności od operacji).

W implementacji repozytorium zajmujesz się jednostkami ORM, które zostaną zmapowane do odpowiednich elementów aplikacji (zwykle z programem odwzorowującym, takim jak AutoMapper). Krótko mówiąc, przy projektowaniu IRepository zapomina się o jego realizacji. Dlatego lepiej jest zaprojektować interfejs przed podjęciem decyzji, czy/jakie ORM będą używane.

Zasadniczo repozytorium jest bramą między kontekstem domeny aplikacji a kontekstem zależności, a aplikacja NIE POWINIEN być łączona z detalami implementacji repozytorium.

+0

+1 Potwierdza przyczynę, dla której zadałem to pytanie –

1

Powinieneś popatrzeć na użycie jednego z szablonów POCO do generowania swoich jednostek. W ten sposób twoje jednostki nie mają specjalnych zależności w Entity Framework i mogą być przekazywane swobodnie między warstwami. Pozwala to zaoszczędzić sporo wysiłku w porównaniu z utrzymaniem całkowicie oddzielnego modelu domeny i mapowania pomiędzy tymi dwoma elementami (chyba że model Twojej domeny znacznie różni się od modelu Twojej jednostki, w którym to przypadku miałoby to więcej sensu).

0

Jeśli używasz podmiotów POCO, możesz założyć, że każdy dostawca wykona podobne zadanie. Pamiętaj również, że zwracasz elementy, które mają przypisane ich właściwości do bazy danych. Można więc założyć, że jeśli elementy nie mają różnych nazw właściwości dla każdego dostawcy (nie mogę znaleźć logicznego wytłumaczenia o różnych nazwach), można je zwrócić bezpośrednio z repozytorium do firmy.

Powiązane problemy