Dlaczego wzorzec repozytorium jest potrzebny w NHibernate?

13

Czytam oficjalną Twoją pierwszą aplikację opartą na NHibernate .

Chociaż samouczek jest dobry i łatwy do naśladowania, zastanawiam się, dlaczego użyto wzorca repozytorium.

W różnych Add, Update, Removemetody w ProductRepositoryrealizacji, kod jest prawie identyczne - wszystkie są z wykorzystaniem transakcji, a różnica jest w „mięsie”, czyli wezwanie session.Saveint Addmetoda, session.Deletew removemetodzie. ( Na stronie brakuje kotwic HTML, ale można przeszukiwać stronę dla odpowiedniego kodu podobnego public void Remove,public void Add )

Ten kod po prostu „czuje się źle”.

Dlaczego autor używa wzorca Repozytorium - czy to tylko w celu demonstracji użycia NHibernate, czy jest to wymagane lub z innego powodu?

Ps. Moje tło pochodzi z Ruby on Rails przy użyciu ActiveRecord, więc staram się zrozumieć, jak działa / jest używany NHibernate.

Zabba
źródło
1
Jeśli wolisz wzór Active Record, możesz użyć Castle Active Record, aby usiąść na szczycie NHibernate castleproject.org/activerecord
Ben Robinson
3
To jest kluczowe pytanie. Trwają dyskusje, czy z niego skorzystać, czy nie. Ayende napisał swoje argumenty, aby nie używać go w repozytorium, to nowy Singleton

Odpowiedzi:

10

Wzorzec repozytorium nie jest wymagany. Podobnie jak w przypadku wszystkich innych wzorów, jest to decyzja „architektoniczna”, którą należy podjąć w związku z potrzebami biznesowymi. Ogólnie wzorzec repozytorium służy do implementacji „Ingorance Persistance Persistance”, co oznacza, że ​​twoje podmioty nie wiedzą nic o tym, jak zachować się na urządzeniu przechowującym (baza danych, XML, plik tekstowy itp.). Jeśli na przykład masz adres jednostki, nie będzie on zawierał logiki trwałości (nie znajdziesz nigdzie czegoś takiego jak adres.Save lub address.Update), ale przekażesz swoją jednostkę do metody repozytorium, która jest odpowiedzialna za zachowanie zmiany

Massimiliano Peluso
źródło
Myślę, że tak i nie. Sama sesja NHibernate jest więc rodzajowym repozytorium. Tak więc dodanie dodatkowego repozytorium jest ogólnie niczym więcej niż dodaniem fasady do obiektu sesji.
w rzeczywistości moja odpowiedź zaczyna się od: „Wzorzec repozytorium nie jest wymagany ...” może być decyzją architektoniczną podejmowaną w oparciu o potrzeby biznesowe
Całkowicie się z tym zgadzam. Ale nie rozumiałem, że sama sesja jest repozytorium, to wszystko.
9

Zaletą użycia wzorca repozytorium jest wyśmiewanie warstwy dostępu do danych, aby można było przetestować kod warstwy biznesowej bez wywoływania kodu DAL. Są inne duże zalety, ale wydaje mi się to bardzo istotne.


źródło
2
+1 wzorzec ActiveRecord bardzo utrudnia izolację DAL w celu wyśmiewania się, co zwykle kończy się na testach jednostkowych wymagających własnej bazy danych (w takim przypadku test jednostkowy staje się testem integracyjnym).
MattDavey,