Валідацію слід проводити якомога швидше.
Перевірка в будь-якому контексті, або модель домену, або будь-який інший спосіб написання програмного забезпечення, повинна відповідати цілі, ЩО ви хочете перевірити, і на якому рівні ви зараз знаходитесь.
Виходячи з вашого запитання, я думаю, що відповідь полягала б у розділенні перевірки.
Перевірка властивості перевіряє, чи є значення для цього властивості правильним, наприклад, коли очікується діапазон між 1-10.
Перевірка об'єкта гарантує, що всі властивості об’єкта є дійсними спільно один з одним. наприклад, BeginDate є перед EndDate. Припустимо, ви читаєте значення з сховища даних, і і BeginDate і EndDate ініціалізуються до DateTime.Min за замовчуванням. Встановлюючи BeginDate, немає причин застосовувати правило "повинно бути до кінця", оскільки це не застосовується. Це правило слід перевірити ПІСЛЯ всіх властивостей встановлено. Це можна назвати на сукупному кореневому рівні
Перевірка також повинна бути попередньо оформлена на сукупному (або сукупному кореневому) об'єкті. Об'єкт замовлення може містити дійсні дані, і так це роблять OrderLines. Але тоді ділове правило зазначає, що жодне замовлення не може перевищувати 1000 доларів. Як би ви застосували це правило, якщо в деяких випадках це дозволено. ви не можете просто додати властивість "не підтверджувати суму", оскільки це призведе до зловживань (рано чи пізно, можливо, навіть ви, просто для того, щоб уникнути цього "бридкого запиту").
далі відбувається валідація на презентаційному шарі. Ви дійсно збираєтесь надіслати об’єкт по мережі, знаючи, що він не вдасться? Або ви запасите користувачеві цей бурдон і повідомте його, як тільки він введе недійсне значення. наприклад, у більшості випадків ваше середовище DEV буде повільніше, ніж виробництво. Ви хочете зачекати 30 секунд, перш ніж вас поінформують про "ви забули це поле ПРОТИ під час ще ДРУГОГО тестового запуску", особливо коли є помилка виробництва, яку потрібно виправити, коли ваш бос дихає вам за шию?
Перевірка на рівні постійності повинна бути максимально наближеною до валідації вартості майна. Це допоможе запобігти виняткам з читанням помилок чи «недійсних значень» під час використання картографів будь-якого типу або звичайних зчитувачів старих даних. Використання збережених процедур вирішує цю проблему, але вимагає написати ту саму логіку перевірки AGAIN та виконати її ПРОТИ. І збережені процедури - це домен адміністратора БД, тому не намагайтеся також виконувати свою роботу (або ще гірше, не турбуйте його цим "солодким вибором, за який він не платить".
тож сказати це деякими відомими словами "це залежить", але принаймні зараз ви знаєте, ЧОМУ це залежить.
Я б хотів, щоб я міг розмістити все це в одному місці, але, на жаль, цього неможливо зробити. Це може поставити залежність від "об'єкта Бога", що містить ВСІ перевірки для ВСІХ шарів. Ви не хочете йти цією темною стежкою.
З цієї причини я викидаю лише винятки валідації рівня властивості. На всіх інших рівнях я використовую ValidationResult методом IsValid, щоб зібрати всі "порушені правила" та передати їх користувачеві в одному AggregateException.
Під час розповсюдження стека викликів я збираю їх знову в AggregateExceptions, поки не дойду до рівня презентації. Сервісний рівень може передавати цей виняток прямо клієнту у випадку WCF як FaultException.
Це дозволяє мені взяти виняток і або розділити його, щоб показати окремі помилки на кожному вхідному елементі управління, або вирівняти його та показати в одному списку. Вибір за вами.
саме тому я також згадав про перевірку презентації, щоб якомога коротше замикати їх.
У випадку, якщо вам цікаво, чому я також маю валідацію на рівні агрегації (або рівень обслуговування, якщо вам подобається), це тому, що у мене немає кришталевої кулі, яка б мені сказала, хто буде використовувати мої послуги в майбутньому. У вас буде достатньо проблем з пошуку власних помилок, щоб не допустити інших помилок ваших :), ввівши недійсні дані, наприклад, ви адмініструєте додаток A, але додаток B подає деякі дані за допомогою вашої служби. Здогадайтесь, кого вони запитують спочатку, коли є помилка? Адміністратор програми B із задоволенням повідомить користувача "немає помилок в моєму кінці, я просто подаю дані".