Существует ли стандартная платформа для проверки параметров .NET, использующая атрибуты?

StackOverflow https://stackoverflow.com/questions/138133

Вопрос

Существует ли стандартная структура (возможно, часть корпоративной библиотеки...или сам .NET), который позволяет выполнять общую проверку параметров в атрибутах метода?

Это было полезно?

Решение

Контракты кода Microsoft, которые являются частью .NET Framework начиная с CTP 4.0 и доступны для более ранних версий .NET Framework как отдельный пакет, позволяют указать предположения по кодированию.Это включает в себя указание предварительных условий, которые могут проверять параметры.

Пример использования для проверки параметров: (скопировано из Документация по кодовым контрактам):

public Rational(int numerator, int denominator)
{
    Contract.Requires(denominator ! = 0);

    this.numerator = numerator;
    this.denominator = denominator;
}

Преимущество использования Code Contracts заключается в том, что эта библиотека станет частью будущих выпусков .NET Framework, поэтому рано или поздно в вашем приложении будет на одну зависимость меньше.

РЕДАКТИРОВАТЬ: Только что заметил, что вы специально просите библиотеку, которая использует атрибуты для проверки аргументов...что Code Contracts этого не делает.Причина, по которой Code Contracts не использует атрибуты, указана в их Часто задаваемые вопросы:

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

Поддержка во время выполнения: Без использования бинарного переписчика контракты, выраженные с помощью атрибутов, не могут быть реализованы во время выполнения.Это означает, что если существуют предварительные условия (или другие контракты), которые вы хотите обеспечить во время выполнения, вам необходимо либо продублировать контракты в коде, либо включить в процесс сборки двоичный переписчик.Contract.RequiresAlways служит как декларативным контрактом, так и проверкой во время выполнения.

Необходимость разбора: Поскольку значения, которые можно использовать с настраиваемыми атрибутами, ограничены, условия в конечном итоге кодируются как строки.Это требует определения нового языка, подходящего для всех исходных языков, требует анализа строк, дублируя все функции, которыми уже обладает компилятор.

Отсутствие поддержки IDE: Выраженные в виде строк, Intellisense, проверка типов и рефакторинг не поддерживаются — все они доступны для разработки контрактов в виде кода.

Другие советы

Корпоративная библиотека Microsoft имеет библиотеку/пространство имен Microsoft.Practices.EnterpriseLibrary.Validation, которая позволяет выполнять проверку с использованием атрибутов.

Хотя контракты Microsoft Code на некоторое время отсутствуют, они по-прежнему размещаются в MS Research, и вы не можете использовать конфигурацию (app.config/database и т. д.) для включения/выключения или даже изменения правил.Моя библиотека Вышибала предоставляет декларативное определение правила:атрибуты в исходном коде или записи app.config для правил на уровне класса/свойства объекта.Библиотека имеет открытый исходный код под лицензией LGPL (вы можете свободно использовать ее в коммерческих продуктах).Если вы настраиваете правила через app.config, вы можете настроить параметры правил без необходимости перекомпиляции.

Динамические данные для ASP.NET (и ASP.NET MVC) позволяет выполнять проверку свойств модели с использованием атрибутов.

Вы также можете использовать пост-острый и реализуйте свои собственные атрибуты для проверки.

Вот пример использования PostSharphttp://dpatrickcaldwell.blogspot.com/2009/03/validate-parameters-using-attributes.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top