2012-04-23 15 views
8

W mojej aplikacji asp.net mvc 3 używam wzorca repozytorium. Mam 3 podmioty, firma, kraj, miasto. Każdy z nich ma swoje własne repozytorium. Podmiot firmy ma klucze zagraniczne FoundedCountry i FoundedCity. Teraz w widoku chcę pokazać szczegóły firmy. W tym widoku chcę zobaczyć szczegóły firmy, a także nazwę FoundedCountry i FoundedCity. Moim zdaniem muszę sobie z tym poradzić za pomocą rodzaju zapytania JOIN. Ale utknąłem w tym, jak osiągnąć to w schemacie repozytorium. Jak mogę obsłużyć to JOIN w schemacie repozytorium?Jak mogę wykonać kwerendę tabel krzyżowych z wzorcem repozytorium?

Dziękuję.

Odpowiedz

4

Repozytorium powinno mieć interfejs oparty na zadaniach. Oznacza to, że ORM, sprzężenia itp. Znajdują się wewnątrz repozytorium. Aplikacja widzi interfejs, który zwraca obiekt, z którego może korzystać.

Oznacza to, że nie tworzy się repozytorium wokół stołu (w dużym stopniu pokonuje cel). W twoim scenariuszu sugeruję, że masz (przynajmniej) 2 repozytoria: jeden zajmie się wszystkim związanym z aktualizacją modelu, a drugi będzie tylko czytał (zapytania).

Oznacza to, że repozytorium kwerend zwróci tylko żądane dane (zasadniczo zwraca bitów modelu widoku). Oczywiście rzeczywiste tabele i połączenia są szczegółami implementacji repozytorium.

+0

"Oznacza to, że nie tworzysz repozytorium wokół tabeli (to w dużej mierze poraża cel). " O ile mi wiadomo, muszę utworzyć repozytorium dla każdej jednostki. Z Twojego komentarza, myślę, że muszę dodać kolejne repozytorium, które będzie obsługiwać złożone zapytania. Dobrze? – SherleyDev

+0

Nie :). Nie musisz "tworzyć repozytorium" dla każdej jednostki. Repozytorium zasadniczo ukrywa bazę danych powiązaną z resztą aplikacji. W repozytorium możesz używać encji, EF lub Nhibernate, to nie ma znaczenia. Repositoryu używa wewnętrznie orm, w twoim przypadku encje, a następnie zwraca obiekty, które aplikacja rozumie. Same obiekty są już abstrakcją używaną przez repozytorium. – MikeSW

+0

W poniższym samouczku jest napisane: "W tym samouczku zaimplementujesz klasę repozytoriów dla każdego typu jednostki." Śledziłem to. http: //www.asp.net/mvc/tutorials/get-start-with-ef-using-mvc/implementation-repozytorium-i-unit-of-work-patterns-in-an-asp-net-mvc-application – SherleyDev

2

Nie twórz wzorca repozytorium w sposób uniemożliwiający dołączanie! Zazwyczaj oznacza to użycie tego samego kontekstu ORM (DataContext/ObjectContext) dla wszystkich instancji powiązanych z bieżącym żądaniem HTTP.

Uważam za wzorzec przeciwny, aby mieć ogólny element IRepository, ponieważ dostęp do bazy danych rzadko jest ograniczony do jednego typu obiektu w tym samym czasie.

Można uznać, że Kontekst danych/ObjectContext jest repozytorium samodzielnie.

Ostatnia rada: Jeśli nie wiesz, do czego jest przeznaczona abstrakcja w repozytorium - nie używaj jej.

+0

Nie zgadzam się z jedną rzeczą: fakt, że Kontekst danych należy uznać za repozytorium. Podczas gdy DC wymusza dostęp do db i sql, to wciąż jest związany z rdbms i IMO, w najlepszym przypadku jest to nieszczelna abstrakcja. – MikeSW

+0

Jeśli ORM jest nieszczelną abstrakcją, jak nieszczelne jest wtedy repozytorium niestandardowe? To jest sito. Jednocześnie uniemożliwia dostęp do pełnej mocy ORM (która jest naturą abstrakcji). – usr

+0

Dobrze zaprojektowane repozytorium nie jest nieszczelne, ponieważ nie ujawnia szczegółów implementacji, takich jak ORM. Repozytorium wykorzystuje pełną moc ORM, jest to jego zadanie. To nie jest praca reszty aplikacji, aby wiedzieć o tym orm lub korzystać z niego. Zobacz ten post http://www.sapiensworks.com/blog/post/2012/04/15/The-Repository-Pattern-Vs-ORM.aspx – MikeSW

Powiązane problemy