Walidacja powinna zostać przeprowadzona jak najszybciej.
Walidacja w dowolnym kontekście, bez względu na model domeny lub inny sposób pisania oprogramowania, powinna służyć temu, CO chcesz zweryfikować i na jakim poziomie jesteś w tej chwili.
Wydaje mi się, że w oparciu o twoje pytanie podzielimy walidację.
Sprawdzanie poprawności właściwości sprawdza, czy wartość tej właściwości jest poprawna, np. Gdy spodziewany jest zakres od 1 do 10.
Sprawdzanie poprawności obiektu gwarantuje, że wszystkie właściwości obiektu są poprawne w połączeniu ze sobą. np. BeginDate jest przed EndDate. Załóżmy, że odczytujesz wartość ze składnicy danych, a zarówno BeginDate, jak i EndDate są domyślnie inicjowane na DateTime.Min. Podczas ustawiania BeginDate nie ma powodu, aby wymuszać regułę „musi być przed EndDate”, ponieważ nie dotyczy to YET. Tę regułę należy sprawdzić PO ustawieniu wszystkich właściwości. Można to wywołać na poziomie zagregowanego katalogu głównego
Walidacja powinna być również przeprowadzona na jednostce agregującej (lub agregującej root). Obiekt zamówienia może zawierać prawidłowe dane, podobnie jak linie zamówień. Ale wtedy reguła biznesowa mówi, że żadne zamówienie nie może przekroczyć 1000 USD. Jak egzekwowałbyś tę regułę w niektórych przypadkach, jest to dozwolone. nie możesz po prostu dodać właściwości „nie sprawdzaj kwoty”, ponieważ prowadziłoby to do nadużyć (prędzej czy później, być może nawet ciebie, by usunąć tę „nieprzyjemną prośbę”).
następnie następuje walidacja na warstwie prezentacji. Czy naprawdę zamierzasz wysłać obiekt przez sieć, wiedząc, że zawiedzie? A może oszczędzisz użytkownikowi tego burdona i poinformujesz go, gdy tylko wprowadzi nieprawidłową wartość. np. przez większość czasu środowisko DEV będzie wolniejsze niż produkcja. Czy chciałbyś poczekać 30 sekund, zanim zostaniesz poinformowany o „PONOWNIE zapomniałeś tego pola podczas KOLEJNEGO uruchomienia testowego”, zwłaszcza gdy występuje błąd produkcyjny do naprawienia, gdy szef oddycha ci po szyi?
Walidacja na poziomie trwałości powinna być jak najbardziej zbliżona do walidacji wartości właściwości. Pomoże to uniknąć wyjątków związanych z odczytywaniem błędów „null” lub „niepoprawna wartość” przy korzystaniu z jakichkolwiek maperów lub zwykłych starych czytników danych. Korzystanie z procedur przechowywanych rozwiązuje ten problem, ale wymaga napisania tej samej logiki waloryzacji PONOWNIE i wykonania jej PONOWNIE. Procedury składowane są domeną administracyjną DB, więc nie próbuj wykonywać JEGO zadania (lub gorzej: „wybieranie nitty, za które mu nie płaci”).
żeby to powiedzieć znanymi słowami „to zależy”, ale przynajmniej teraz wiesz, DLACZEGO to zależy.
Chciałbym umieścić to wszystko w jednym miejscu, ale niestety nie da się tego zrobić. Spowodowałoby to uzależnienie od „obiektu Boga” zawierającego WSZYSTKIE sprawdzanie poprawności WSZYSTKICH warstw. Nie chcesz iść tą ciemną ścieżką.
Z tego powodu zgłaszam wyjątki sprawdzania poprawności tylko na poziomie właściwości. Wszystkie pozostałe poziomy używam ValidationResult z metodą IsValid, aby zebrać wszystkie „złamane reguły” i przekazać je użytkownikowi w jednym AggregateException.
Podczas propagowania stosu wywołań, zbieram je ponownie w AggregateExceptions, aż dojdę do warstwy prezentacji. Warstwa usługi może zgłosić ten wyjątek bezpośrednio do klienta w przypadku WCF jako wyjątek błędu.
To pozwala mi wziąć wyjątek i podzielić go, aby wyświetlić poszczególne błędy przy każdym elemencie sterującym wejściowym, lub spłaszczyć go i wyświetlić na pojedynczej liście. Wybór nalezy do ciebie.
dlatego wspomniałem również o sprawdzaniu poprawności prezentacji, aby je jak najbardziej zwierać.
Jeśli zastanawiasz się, dlaczego mam również sprawdzanie poprawności na poziomie agregacji (lub na poziomie usługi, jeśli chcesz), to dlatego, że nie mam kryształowej kuli, która mówi mi, kto będzie korzystać z moich usług w przyszłości. Będziesz miał dość problemów ze znalezieniem własnych błędów, aby inni nie popełnili Twoich błędów :) wprowadzając nieprawidłowe dane. Np. Administrujesz aplikacją A, ale aplikacja B podaje pewne dane za pomocą Twojej usługi. Zgadnij, kogo pytają najpierw, kiedy pojawia się błąd? Administrator aplikacji B z przyjemnością poinformuje użytkownika „na moim końcu nie ma błędu, po prostu wprowadzam dane”.