2013-08-07 14 views
11

Przede wszystkim chcę wyjaśnić, że jestem nowy w Domain Driven Design i zadaję to pytanie, ponieważ przeczytałem coś, co nazywa się Anemic Domain Model.Czy wzorzec repozytorium z projektowaniem opartym na domenie staje się wzorcem?

W większości przypadków widzę następujące rzeczy podczas pracy z wzorcem repozytorium.

  1. Mamy jeden ogólny repozytorium
  2. Mamy model, który tylko zawierają zestaw właściwości publicznych, ale nie zawiera żadnej metody (tak stać anemiczne Domain model jak na definicji DDD), ponieważ tutaj repozytorium klasa obsługiwać inne proces dla tego podmiotu lub modelu.

Proszę podać cenną odpowiedź na moje zapytanie.

Pozwolę sobie wyjaśnić kilka rzeczy.

Generyczne repozytorium oznacza Ogólny interfejs, który zostanie zaimplementowany przez repozytorium jednostek.

Moja dezorientacja dotyczy następujących rzeczy

Na przykład: Przypuśćmy, że chcesz zapisać

public class User 
    { 
     public int Id { get; set;} 
     public string Name { get; set}; 
    } 

    public class UserRepository : IRepository<User> 
    { 
     // All Operation Like Save/Get/UserEntity (Domain Object)  
    } 

Więc tutaj jest moja klasa User zrobić nic, zamiast po prostu mają właściwości i inne uchwytu działania poprzez UserRespository. Tak więc moim użytkownikiem jest Anemic Domain model. (Ponieważ nie robi nic konkretnego)

Tutaj w załączonym obrazie Rozważam ProductRepository, więc moje pytanie brzmi: Czy klasa Mojego produktu jest modelem anemicznym?

Proszę wziąć pod uwagę przykładowy obraz, co próbuję powiedzieć.

enter image description here

+0

Czy mógłbyś rozwinąć więcej? Co sprawia, że ​​myślisz, że Repozytorium będzie antyprzemysłem? Czyjejś opinii? Twój własny? Jeśli szukasz wartościowych odpowiedzi, wpisz pewną wartość :) –

+0

Nie jest to moje własne, że Repozytorium jest anty wzorzec, ale jestem mylący sposób, w jaki Anemiczna definicja modelu domeny i wzór repozytorium. Podobnie jak w przypadku repozytorium, zachowaj ostrożność, ale jednostka nie ma żadnej metody zapisu. – dotnetstep

+0

Byłoby to całkowicie poprawne w DDD, pomyśl o repozytoriach jako usługach. –

Odpowiedz

15

Repozytorium wzór nie jest anty-wzorzec per se, ale widziałem daleko do wielu implementacjach DDD gdzie repozytorium wzór świadczonych niewielką lub żadną wartość. Podaj swoją warstwową architekturę n-warstwową bez wartościowania pragmatycznemu ekspertowi od hardcore'ów, a on prawdopodobnie poda ci "krytykę" (i, co mogę powiedzieć).

Repozytorium plusy wzór:

  1. abstrakcją od użytej technologii utrwalania
  2. możliwość definiowania kruszywa korzenie, tylko łączne korzenie powinny mieć repozytoria
  3. sposób jednoznacznie stwierdzając, które operacje są ważne dla danego zagregowanego roota, na przykład, jeśli nie jest ono poprawne, aby usunąć twój obiekt, twoje repozytorium nie powinno mieć żadnej metody usuwania.
  4. Coś, co jest łatwe do sprawdzenia bez bazy danych (stubbing swoje repozytoria)

minusy repozytorium za wzór:

  1. Przywiązanie do technologii utrwalania.
  2. Jeszcze inna-tier

Osobiście wolę korzystania z repozytorium deseniu, kiedy robi DDD, ale rozwiązanie brzmi bardziej jak Active Record wzór, usuwając większość zalet korzystania z repozytoriów w pierwszej kolejności. Nigdy nie robię generycznych repozytoriów, ponieważ usuwają zalety 2 & 3 (Mogę mieć ogólną implementację, ale nie udostępniam jej bezpośrednio do kodu repozytorium-konsumenta).

A także: nie używaj repozytoriów dla populacji DTO, ViewModels, itp. Używaj oddzielnych modeli i technologii do modelowania zapisów (DDD może działać świetnie) i czyta.

20

Zgadzam się, że interfejs IRepository generalnie jest stratą czasu. Jeśli umieściłem podstawowe operacje CRUD w moim interfejsie IRepository, to jak mam sobie radzić z danymi, takimi jak dane audytu? Skasowanie go byłoby zabronione. Czy powinienem po prostu zwrócić InvalidOperationException, kiedy próbuję zadzwonić pod numer Delete()?

Niektórzy sugerują mniejsze interfejsy, takie jak IReadable, IWriteable, IUpdateable lub IDeleteable. Myślę, że to podejście jest jeszcze bardziej nieprzyjemne.

Osobiście (i to jest po prostu moje własne rozwiązanie, po tym, jak wszystko inne dobrze przebiega wokół bloku), dla DDD wolę używać interfejsu na repozytorium (głównie do IoC i testowania jednostkowego). To daje mi IUserRepository, itd. Moje repozytoria również pobierają (jako parametry) i zwracają encje domeny (zagregowane korzenie lub tylko pojedyncze jednostki). W ten sposób nie ma żadnych anemicznych obiektów DTO do utrzymania lub zagospodarowania mojego rozwiązania. Mimo to nadal korzystam z modeli widoku, aby chronić poufne dane przed moimi widokami.

Istnieje wiele argumentów online za i przeciw wzorowi repozytorium.

Powiązane problemy