1) Co robisz, jeśli chcesz wyłączyć ORM, miałbyś w aplikacji określony kod ORM, gdybyś nie zawierał go w repozytorium.
Nie byłem jeszcze w sytuacji, gdy firma nagle postanowiła zmienić technologię dostępu do danych. Jeśli tak się stanie, konieczne będą pewne prace. Mam tendencję do abstrakcyjnego dostępu do danych poprzez interfejsy. Repozytorium jest jednym ze sposobów rozwiązania tego problemu.
Miałbym wtedy inny zestaw do konkretnej implementacji mojej warstwy dostępu do danych. Na przykład mogę mieć:
Company.Product.Data
i Company.Product.Data.EntityFramework
zespoły. Pierwszy zestaw byłby używany wyłącznie do interfejsów, a inny byłby konkretnym wdrożeniem logiki dostępu do danych Entity Framework.
2) Czy wzorzec repozytorium jest nadal aktualny, gdy nie używasz ORM i sam używasz ADO.net do dostępu do danych i zapełniania danych obiektowych?
Myślę, że to ty decydujesz, który wzór jest ważny, czy nie. Użyłem wzorca repozytorium w warstwie prezentacji. Należy pamiętać, że ludzie lubią wrzucać obowiązki do repozytoriów. Zanim się zorientujesz, twoja klasa repozytorium będzie tańczyć, śpiewać i robić różne rzeczy. Chcesz tego uniknąć.
Widziałem klasę repozytorium, która zaczęła się od odpowiedzialności za GetAll, GetById, Update i Delete, co jest w porządku. Do czasu zakończenia projektu ta sama klasa dysponowała dziesiątkami metod (obowiązków), których nigdy nie powinno być. Na przykład GetByForename, GetBySename, UpdateWithExclusion i wszelkiego rodzaju szalone rzeczy.
Tutaj pojawiają się zapytania i polecenia.
3) Jeśli używasz ORM, ale nie wzorca repozytorium, gdzie przechowujesz najczęściej używane zapytania. Czy mądrze byłoby reprezentować każde zapytanie jako klasę i mieć jakąś fabrykę zapytań do tworzenia instancji?
Myślę, że bardzo dobrym pomysłem jest stosowanie zapytań i poleceń zamiast repozytoriów. Wykonuję następujące czynności:
Zdefiniuj interfejs dla zapytania. Pomoże to w teście jednostkowym. Na przykładpublic interface IGetProductsByCategoryQuery { ... }
Zdefiniuj konkretną implementację zapytania. Będziesz mógł wstrzykiwać je za pośrednictwem wybranych ram IoC. Na przykładpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Teraz zamiast zanieczyszczać repozytorium dziesiątkami obowiązków, po prostu grupuję moje zapytania w przestrzeni nazw. Na przykład interfejs dla powyższego zapytania może istnieć w: Company.SolutionName.Products.Queries
a implementacja może istniećCompany.SolutionName.Products.Queries.Implementation
Jeśli chodzi o aktualizację lub usuwanie danych, używam wzorca poleceń w ten sam sposób.
Niektórzy mogą się nie zgodzić i powiedzieć, że zanim projekt zostanie ukończony, będziesz mieć dziesiątki klas i przestrzeni nazw. Tak, będziesz. Moim zdaniem to dobrze, że możesz przeglądać wybrane przez siebie rozwiązanie w IDE i od razu zobaczyć, jakie obowiązki ma dany komponent. Jeśli zamiast tego zdecydowałeś się zastosować wzorzec repozytorium, będziesz musiał zajrzeć do każdej klasy repozytorium, próbując wywiązać się ze swoich obowiązków.