Я использую FluentValidation для проверки объекта, и потому что у этого объекта есть член коллекции, я пытаюсь использовать RuleForEach
. Например, предположим, что у нас есть Customer
и Orders
, и мы хотим, чтобы заказ клиента не имел общего значения, превышающего максимально допустимое для этого клиента:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
До сих пор так хорошо. Однако мне также необходимо записать дополнительную информацию о контексте ошибки (например, где в файле данных была обнаружена ошибка). Я обнаружил, что это довольно сложно достичь с помощью FluentValidation, и лучшим решением на данный момент является использование метода WithState
. Например, если я обнаружил, что данные адреса клиента неверны, я могу сделать что-то вроде этого:
this.RuleFor(customer => customer.Address)
.Must(...)
.WithState(customer => GetErrorContext(customer.Address))
(где GetErrorContext
- мой метод для извлечения соответствующих деталей.
Теперь проблема заключается в том, что при использовании RuleForEach
сигнатура метода предполагает, что я предоставил выражение, которое ссылается на Customer
, а не на конкретный Order
, который вызвал отказ проверки. И у меня, похоже, нет способа сказать, какой порядок имел проблему. Следовательно, я не могу сохранить соответствующую контекстную информацию.
Другими словами, я могу это сделать только:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
.WithState(customer => ...)
... когда я действительно хотел это сделать:
this.RuleForEach(customer => customer.Orders)
.Must((customer, orders) => orders.Max(order => order.TotalValue) <= customer.MaxOrderValue)
.WithState(order => ...)
Нет ли способа получить доступ к деталям (или даже индексу) элементов (ов) коллекции, которые не удалось?
Я предполагаю, что другой способ взглянуть на это - я хочу, чтобы WithState
имел эквивалент WithStateForEach
...