1. Это где я должен бросать исключения? (это не похоже на исключительный случай, поэтому я думаю, что нет, но я могу ошибаться).
Лично я считаю, что вы должны вернуть объект с результатом, а также с любыми ошибками проверки, и не выдавать исключение для проверки данных, будь то из-за отсутствия информации (проверка формата) или проверки бизнес-логики. Тем не менее, я предлагаю выдать исключение для ошибок, которые не связаны с самими данными, т.е. если происходит сбой фиксации базы данных с действительными данными и т. Д.
Я думаю, что провал проверки не является «исключительным случаем». Я лично чувствую, что все, что пользователь может испортить, просто не введя достаточное количество / правильных данных и т. Д., Является чем-то, что не является исключением - это стандартная практика и должна обрабатываться непосредственно API.
То, что не связано с тем, что делает пользователь (например, проблемы с сетью, проблемы с сервером и т. Д.), Является исключительным происшествием и требует исключения.
2.Могу ли я использовать void и параметр "out"? Если да, то какой это должен быть тип?
3.Могу ли я использовать возвращаемый тип объекта и помещать туда данные о том, что происходит?
Я лично предпочитаю третий вариант. «out» параметры не очень значимы. Кроме того, вы захотите вернуть более одной информации о состоянии из этого вызова - вам нужно будет вернуть достаточно информации, чтобы пометить соответствующие свойства как недействительные, а также любую полную информацию по всей операции.
Вероятно, для этого потребуется класс, который содержит, как минимум, статус фиксации (успех / неудачный формат / неудачная бизнес-логика / и т. Д.), Список сопоставлений для свойств-> ошибок (т. Е. IDataErrorInfo информация о стиле) и, возможно, список ошибок, которые не привязаны к определенному свойству, а скорее касаются бизнес-логики операции в целом или комбинации предлагаемых значений свойств.
4.Некоторые другие варианты, которые я полностью пропустил?
Другой вариант, который мне очень нравится, - это проверка в отдельной сборке от уровня бизнес-обработки. Это позволяет повторно использовать логику проверки на стороне клиента.
Приятно то, что вы можете значительно упростить и уменьшить сетевой трафик. Клиент может предварительно проверить информацию и отправлять данные по сети только в том случае, если она действительна.
Сервер может получать достоверные данные, проверять их и ничего не возвращать, кроме одного результата коммита. Я считаю, что это должно иметь как минимум три ответа - успех, неудача из-за бизнес-логики или неудача из-за форматирования. Это обеспечивает безопасность (вам не нужно доверять клиенту) и предоставляет клиенту информацию о том, что не обрабатывается должным образом, но избегает передачи как неверной информации из client-> server, так и информации о проверке из server-> client, поэтому может резко сократить трафик.
Уровень проверки затем может (безопасно) отправить информацию на уровень CRUD для отправки.