Мы используем инфраструктуру проверки (которую мы сами создали), которая позволяет нам делать проверки объектов.
string Validation<T,U>(T obj, Func<T,U> selector, Validations.IsNotNull,
string failureMessage)
{
var propertyToBeValidated = selector(obj);
// Do validation here, if it fails, return failure message
}
Проблема с этим:
- Сообщение обязательно.Мы не можем автоматически сгенерировать осмысленное сообщение, глядя на селектор.
Другой вариант - изменить подпись вышеуказанного метода на:
string Validation<T,U>(T obj, Expression<Func<T,U>> selector,
Validations.IsNotNull, string failureMessage = null)
В этом случае сообщение об ошибкеявляется необязательным, и мы можем получить имя свойства из дерева выражений.
Однако для этого требуется Expression.Compile, прежде чем можно будет вызывать селектор, и замедляет работу на 3 порядка.На данный момент сообщения являются обязательными, но поскольку проверки выполняются где-то еще, рефакторинг также требует изменения сообщений проверки.
Что бы вы предложили:
- Изменить подпись и принять выражения.При необходимости кэшируйте скомпилированные выражения и автоматически генерируйте сообщения.Если сообщение предоставлено, используйте его вместо этого.
- Изменение сообщений вручную - это приемлемые накладные расходы, поскольку у вас хорошее тестовое покрытие.Оставьте подпись как есть и избегайте дополнительной сложности и снижения производительности.
Редактировать: Мы используем эту платформу проверки для нескольких слоев.В наших контроллерах для проверки входных параметров, в наших службах для проверки входящих запросов и в наших интеграционных тестах для проверки состояния объектов после некоторых операций.Стоимость выражения. Компиляция незначительна по сравнению с некоторыми из этих затрат, но не незначительна по сравнению с доступом к базе данных и т. Д. Спасибо