Mamy jakiś serwis, który pobiera encję z repozytorium i wykonuje na niej jakąś logikę. Encja składa się z np. 10 value objectów i każdy z nich ma mniej lub bardziej skomplikowaną walidację. Encja w repozytorium przed pobraniem jest mapowania np. z encji hibernetowej na encję domenową i w czasie tego mapowania uruchamiają się walidatory value objectów i tutaj jest problem, bo skoro encja już była zapisana w repozytorum, to siłą rzeczy musi być poprawna i ta walidacja jest zbędną, ale teraz pytanie: jak w takim razie pominąć ją? Jedna spraw to bezsens takiej walidacji a druga wydajność. Czy jest sens się tym przejmować?
Nigdy w życiu nie widziałeś bazy z uszkodzonymi danymi? Z innej strony - czy czasem warstwa repo ma uniezależnić od warstwy magazynowania danych? Czy zatem mogą istnieć takie warstwy magazynowania, które nie zawierają mechanizmów sprawdzania spójności, a nawet nie zawierają struktur definiujących format danych? Czy w takich przypadkach walidacja jest porządana?
Albo migracja starych danych, albo w warstwie repozytorium robisz chamskiego ifa zanim złożysz agregat/encje :)
Ale na czym polega ta walidacja? Jeśli powiedzmy jakiś wymagany value object nie jest obecny, a zgodnie z Twoją walidacją biznesową coś takiego nie powinno nigdy mieć miejsca, i masz po prostu uszkodzone dane, to walidacja siłą rzeczy musi się skończyć jakimś wyjątkiem/błędem. A co za tym idzie- jeśli jakiś obiekt jest np. nullem to ja bym pozwolił procesowi (biznesowemu) w sposób "naturalny" się wywalić, zamiast przy ładowaniu encji z bazy sprawdzać czy coś co nie miało prawa być nullem nie łamie tej zasady.
W przeciwnym razie będziesz musiał duplikować pewne zasady biznesowe poza Twoim modelem domenowym. Zamiast mieć te zasady w agregatach i serwisach domenowych, będziesz je dodatkowo musiał umieścić przy wyciąganiu encji z bazy.
Samo rozdrabnianie się nad takim problemem sugeruje że prawdopodobnie źle podchodzisz do pisania aplikacji opartych o DDD, bo zamiast skupiać się na zasadach biznesowych skupiasz się na technikaliach.
Jeśli masz milion operacji na sekundę to wydajność tu będzie miała wpływ. Ale jak to typowa aplikacja biznesowa to bym się tą dodatkową walidacją nie przejmował. Fajnie, jest, spoko. A my zajmijmy się czymś pożytecznym i np zbudujmy nowy feature albo zróbmy gdzieś refaktoring, dopiszmy testy...
Edelner napisał(a):
Mamy jakiś serwis, który pobiera encję z repozytorium i wykonuje na niej jakąś logikę. Encja składa się z np. 10 value objectów i każdy z nich ma mniej lub bardziej skomplikowaną walidację. Encja w repozytorium przed pobraniem jest mapowania np. z encji hibernetowej na encję domenową i w czasie tego mapowania uruchamiają się walidatory value objectów i tutaj jest problem, bo skoro encja już była zapisana w repozytorum, to siłą rzeczy musi być poprawna i ta walidacja jest zbędną, ale teraz pytanie: jak w takim razie pominąć ją?
No najprościej to chyba nie uruchamiać, nie?