Do czego służy warstwa repozytorium w projekcie?
Do czego służy warstwa repozytorium w projekcie?
Odpowiedź najlepiej rozpocząć od definicji wzorca: Mediates between the domain and data mapping layers using a collection-like interface for accessing domain objects. Źródło: http://martinfowler.com/eaaCatalog/repository.html
W uproszczeniu można więc powiedzieć, że wzorzec Repository stanowi warstwę izolującą dane przechowywane w magazynie od ich reprezentacji obiektowej używanej w aplikacji. W praktyce oznacza to, że możemy zamienić warstwę przechowywania/danych bez zmian w pozostałej części systemu, czyli zastosować różne magazyny np. w testach jednostkowych i wydaniu produkcyjnym.
Przepraszam, chodzi oczywiście o wzorzec projektowy.
Przykład wzorca z kodem:
W systemie korzystającym z definicji klasy:
class Question { public int Id { get; set; } public string Category { get; set; } }
Utworzenie interfejsu repozytorium:
interface IQuestionRepository { Question GetById(int id); IEnumerable<Question> FindByCategory(string category); }
Umożliwia skonstruowanie na potrzeby testów jednostkowych uproszczonego repozytorium:
class InMemoryQuestionRepository:IQuestionRepository { List<Question> db = new List<Question>{ new Question{ Id=1,Category="color"}, new Question{ Id=2,Category="design"}}; public Question GetById(int id) { return db.FirstOrDefault(q => q.Id == id); } public IEnumerable<Question> FindByCategory(string category) { return db.Where(q => q.Category == category); } }
Dzięki takiemu podejściu możemy uniknąć konfiguracji bazy danych bądź usługi odpowiedzialnej za utrwalanie stanu i odpytywanie magazynu w sytuacji, gdy nie są potrzebne ich implementacje, a wystarczy uproszczona abstrakcja. Dodatkowo, zaletą takiego podejścia jest możliwość zmiany magazynu, np. w sytuacji, gdy system obsługuje przechowywanie lokalne i zdalne (w chmurze).