2009-11-09 19 views
6

Zacząłem aktualizować jedną z naszych wewnętrznych aplikacji, napisaną w ASP.NET Web Forms i przechodząc do ASP.NET MVC.Porządkowanie klas za pomocą wzorca projektowania repozytorium

Próbuję wykorzystać wzorzec projektowania repozytorium dla moich zajęć, co prowadzi mnie do pytania, ile umieścić w repozytorium.

Mam następujące podmioty:

  • Temat
  • Temat Komentarze (wątek może mieć wiele komentarzy)
  • Rewizje wątek (dowolnym czasie Temat jest edytowany, korekta jest rejestrowana)
  • Subskrypcje tematów (pozwala użytkownikom na zasubskrybowanie zmian dla określonego tematu z zakresu )

Mam obecnie interfejs dla ITopicRepository i klasy o nazwie TopicRepository, która obsługuje cały podstawowy CRUD dla tematu. Teraz przygotowuję się do dodania kodu do komentarzy, wersji i subskrypcji.

Zastanawiam się, czy WSZYSTKO to przechodzi do TopicRepository LUB czy utworzyć repozytorium dla każdej z encji, na przykład TopicRevisionRepository i tak dalej.

Odpowiedz

8

Istnieje znaczna różnica między średnią strategią dostępu do danych MVC a zrozumieniem schematu repozytorium opartą na systemie Domain-Driven-Design.

Większość próbek, które zobaczysz dla ASP.Net MVC, to zaledwie niewielki krok poza ActiveRecord, używając obiektów repozytorium na jednostkę. To, co faktycznie implementują, jest rodzajem Tabelowej Bramki Danych i używanie słowa Repozytorium zamiast Bramy.

Nie ma w tym nic złego w wielu aplikacjach i generalnie zacząłem nowe aplikacje z tym samym podejściem, dopóki nie udowodnię, że potrzebuję czegoś innego. Jednak zasada Domain Driven Design, z której zasadniczo korzysta się z idei repozytorium, oznaczałaby identyfikację Root agregujących i konsolidację dostępu do danych dla tych obiektów podrzędnych za pośrednictwem repozytorium agregatu root.Pozwala to na umieszczenie granic wokół zmian stanu w magazynie danych i może pomóc między innymi wymusić zmiany transakcyjne.

Edytowane w celu dodania: W twoim przykładzie wydaje się mało prawdopodobne, aby zmodyfikować któryś z tych obiektów podrzędnych w izolacji od obiektu nadrzędnego, więc chciałbym pokusić się o stwierdzenie, że "temat" jest zbiorczym źródłem dla Twoja domena.

1

Moim zdaniem powinno to iść w jego własnym repozytorium ...

Edit:

pośredniczy pomiędzy domeny i danych warstwach mapowania za pomocą interfejsu zbierającego podobny dostępu do domeny obiektów.

Repository Pattern

Pozwala to jeśli zainteresowany użyć rodzajowe repozytorium jak this example co oznacza mniej kodu ...

2

Patrząc na NerdDinner tutorial, wydają się iść z respository jednego podmiotu.

Kiedy myślisz o tym, ma to sens. Będą przypadki, w których chcesz mieć kontrolę nad tym, kiedy ładować elementy podrzędne.

2

Wydaje mi się, że zależy to od sposobu, w jaki uzyskasz dostęp do swoich danych. Zmiany są zawsze będzie patrzeć na temat z komentarzami i na odwrót za podobne (32) Komentarze elementów interfejsu użytkownika.

W związku z tym Twój temat staje się Aggregate Root i do tego podejścia potrzebne jest tylko jedno repozytorium.

Jedną z rzeczy do rozważenia jest to, że jeśli masz wiele małych rzeczy, potrzebujesz bardzo wąskiego dostępu do listy opcji rozwijanych, które naprawdę nie wymagają pełnego repozytorium. Problem polega na tym, że po przejściu 20 jednostek otrzymasz 20 interfejsów i 20 repozytoriów do przemyślenia w swoim rozwiązaniu.

Jest bardzo pragmatyczna, aby mieć tylko repozytoria dla swoich zagregowanych źródeł i przechowywać razem repozytoria innego typu. Na przykład DropdownlistRepository lub coś takiego.

W końcu na etapie projektu były obawy dotyczące wydajności, które nie mają znaczenia, a pobranie całego wykresu obiektu dla "tematu" prawdopodobnie nie jest tak źle. Zachowaj prostotę, jeśli korzystasz z mapera ORM, będzie on w stanie poradzić sobie z tematem za każdym razem, gdy go potrzebujesz, a wszystkie jego elementy podrzędne będą leniwie ładowane.

+1

Łącze Aggregate root należy zaktualizować. –

Powiązane problemy