No mam regułę biznesową, że w systemie nie może istnieć 2 klientów z tym samym NIPem. Weryfikację tej reguły chciałbym mieć w warstwie logiki biznesowej, a nie w warstwie aplikacji, dlatego zrobiłem CustomerFactory
a konstruktor Customera
ustawiłem na internal
, żeby warstwa aplikacja nie mogła sobie od tak tworzyć tych klientów jak jej się podoba.
Mam wrażenie, że sama logika biznesowa nie jest w stanie tego zrobić, ale mniejsza.
Dlaczego CustomerFactory
? Dlaczego nie NipUniquenessValidator
? Albo dlaczego konstruktor Customer
nie przyjmuje obiektu klasy UniqueNip
pochodzącego z jakiegoś tam serwisu aplikacyjnego odpowiedzialnego za dostarczanie prawidłowych NIPów?
Tworzenie kontrahentów to niezbyt jaskrawy przykład, więc weźmy np. tworzenie zamówień. W pierwszym lepszym ERP jest z 10 ścieżek tworzenia zamówienia. Chciałbym mieć logikę związaną z tworzeniem zamówień w projekcie domenowym, żeby mi było łatwiej weryfikować reguły biznesowe i dodawać nowe przypadki użycia. Nie chciałbym wypuszczać logiki biznesowej do warstwy aplikacji.
Dobrze, a co to znaczy "logika związana z tworzeniem zamówień"? Pobranie jakichś danych ze źródła, aby takie zamówienie utworzyć, to jest "logika związana" czy już nie?
Eh, to ja już naprawdę nie wiem. Kiedy mam robić te serwisy domenowe?
Przez ostatnie 8 lat w pracy nie zrobiłem żadnego, więc obstawiam, że to się dzieje w weekendy. ;)
Unikalność NIPu to warunek techniczny, OK. No to powiedzmy, że mam wymaganie, żeby się nie dało stworzyć zamówienia dla kontrahenta, jeśli kontrahent ma już zamówienia będące w trakcie na kwotę łączną większą niż 100 000. To też sprawdzać w warstwie aplikacji?
A w encji kontrahenta nie da rady?