Что бы вы выбрали, небольшое снижение производительности или некоторую дополнительную сложность? - PullRequest
1 голос
/ 04 января 2011

Мы используем инфраструктуру проверки (которую мы сами создали), которая позволяет нам делать проверки объектов.

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 порядка.На данный момент сообщения являются обязательными, но поскольку проверки выполняются где-то еще, рефакторинг также требует изменения сообщений проверки.

Что бы вы предложили:

  • Изменить подпись и принять выражения.При необходимости кэшируйте скомпилированные выражения и автоматически генерируйте сообщения.Если сообщение предоставлено, используйте его вместо этого.
  • Изменение сообщений вручную - это приемлемые накладные расходы, поскольку у вас хорошее тестовое покрытие.Оставьте подпись как есть и избегайте дополнительной сложности и снижения производительности.

Редактировать: Мы используем эту платформу проверки для нескольких слоев.В наших контроллерах для проверки входных параметров, в наших службах для проверки входящих запросов и в наших интеграционных тестах для проверки состояния объектов после некоторых операций.Стоимость выражения. Компиляция незначительна по сравнению с некоторыми из этих затрат, но не незначительна по сравнению с доступом к базе данных и т. Д. Спасибо

Ответы [ 3 ]

2 голосов
/ 04 января 2011

Почему вы должны выбрать?В качестве перегрузок вы можете использовать как

string Validation<T,U>(T obj, Func<T,U> selector, Validations.IsNotNull,
                        string failureMessage)

, так и

string Validation<T,U>(T obj, Expression<Func<T,U>> selector,
                          Validations.IsNotNull)

.Таким образом, вы получаете только перфект, когда нет сообщения и вы не можете кэшировать скомпилированную лямбду.

0 голосов
/ 14 января 2011

Мы пришли к выводу, что для нас наиболее целесообразно использовать выражение. Затраты на вызовы DB и WS были намного больше, чем это.

0 голосов
/ 04 января 2011

Ну, я думаю, что сравнивать это с вызовами БД - все равно что сравнивать яблоки и апельсины.И вполне вероятно, что для каждого объекта этот код будет вызываться несколько раз, представьте себе класс, украшенный этим для параметров, закрытых членов, и объект этого типа, созданный в цикле for: D..Hope, что я говорю, имеет смыслпотому что я на самом деле не делал никакого кодирования с использованием обобщений или компиляции выражений и тому подобного ... но я предполагаю, что вы пытаетесь угадать, как добраться до проверяемого материала путем анализа дерева выражений.

Лично я думаю, что лучше держать сообщение обязательным, как насчет возможности предоставления двух отдельных методов (это полиморфизм), поддерживаемых с хорошо документированным предостережением, когда сообщения не предоставляются ...

...