6

Mam pytanie dotyczące sprawdzania wyjątkowości w DDD. Wiem już, że mam kilka pytań na ten temat na stackoverflow, ale one tak naprawdę nie odpowiadają na moją wątpliwość:unikalne sprawdzanie poprawności w DDD

Czy agregat może zachować referencję repozytorium, aby sprawdzić unikalność aktualizacji/wstawienia do bazy danych? Czy jest to zadanie wykonywane przez usługę aplikacji zamiast modelu domeny?

Powiedzmy, że chcesz sprawdzić, czy nazwa modelu użytkownik jest wyjątkowa gdy użytkownik Istnieje kilka metod, które można myślę:

  • użytkownika referencyjnego modelu UserRepository wykonaj sprawdzania unikalności w Weryfikuj()
  • Utwórz usługę domeny, aby sprawdzać wyjątkowość, używając UserRepository (wydaje mi się to nieco dziwne, ponieważ myślę, że normalna usługa domeny jest używana tylko w przypadku, gdy logika obejmuje więcej niż jeden model domeny).
  • Utwórz obiekt specyfikacji w warstwie domeny, w odniesieniu do Use rRepository do hermetyzacji unikalną regułę sprawdzania i wykorzystanie usługi warstwy aplikacji to zrobić przed sprawdzanie aktualizacji/insert

A jeśli mogę użyć Dependency Injection, wciąż zastanawiam się, jak wstrzykiwać UserRepository do Użytkownika w podejściu 1, lub usługa domeny w podejściu 2 lub usługa aplikacji w podejściu 3, ponieważ w każdym przypadku, w przypadku obiektu/usługi/obiektu specyfikacji użytkownika/domeny, muszę ręcznie utworzyć obiekt, więc jedyna opcja, którą wydaje się używać lokalizatora usług w IoC dostać instancję. Ale lokalizator usługa jest anty-wzorzec więc chcę uniknąć to

Wszelkie przykładowy kod będzie bardzo doceniane

+2

Powiedziałbym, że powinieneś zaimplementować to w warstwie usług. Aby być bardziej szczegółowym, zdefiniuj klasę sprawdzania poprawności dla określonego typu logiki biznesowej (polecenie) i obsłuż poprawność w dekoratorze, który otaczasz klasą usługi. – Steven

+0

Czy byłoby to pomocne? http://stackoverflow.com/a/11958251/625332 – Dmitry

+0

@Steven, więc powinienem utworzyć UserValidator do realizacji kontroli dla użytkownika w warstwie usługi? Czy jest uważane za przeciek reguły biznesowej (wyjątkowość nazwy użytkownika) poza warstwę domeny? –

Odpowiedz

4

myślę, że sprawdzanie unikatowości wpada Repository odpowiedzialności. Repozytorium wie o wszystkich agregatach, ponieważ ma symulować zbieranie domen, więc naturalnie prosi się o unikalność repozytorium (jak na przykład w HashMapie).

// repository 
interface Users { 
    // implementation executes SQL COUNT in case of relation DB 
    bool IsNameUnique(String name); 

    // implementation will call IsNameUnique and throw if it fails 
    void Add(User user); 
} 

To jest nieszczelny abstrakcji w pewnym sensie, ponieważ w środowisku wielu użytkowników to muszą być egzekwowane na stronie magazynu danych (UNIQUE SQL ograniczenie dla przykładu, lub blokującej).

IsNameUnique prawdopodobnie nie powinien być wywoływany z agregatu użytkownika, przeniesie to połączenie do aplikacji lub usługi domeny, w zależności od tego, jak skonstruowana jest reszta aplikacji.

Aby uzyskać alternatywne podejście, patrz Uniqueness validation in CQRS Architecture.

+0

, więc sugerujesz, aby postępować zgodnie z podejściem 2 powyżej, aby utworzyć usługę domeny do wywoływania repozytorium w celu sprawdzenia unikalności? Czy w DDD jest typowe tworzenie usługi sprawdzania poprawności w warstwie domeny? Jestem nowy w DDD, więc niezbyt pewny. –

+0

To, czy używać tego repozytorium z Domain, czy z usługi Application zależy od twoich przypadków użycia, jedno z nich jest w porządku, o ile nie używasz tej metody z agregatu. – Dmitry

+0

dziękuję, w końcu postanawiam wybrać takie podejście: http: // lostechies.com/jimmybogard/2007/10/24/entity-validation-with-visitors-and-extension-methods/ –