Есть ли стандартная структура для проверки параметров .NET, которая использует атрибуты? - PullRequest
8 голосов
/ 26 сентября 2008

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

Ответы [ 6 ]

7 голосов
/ 26 сентября 2008

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

4 голосов
/ 17 сентября 2009

Контракты Microsoft Code , которые являются частью .NET Framework начиная с версии 4.0 CTP и доступны для более ранних версий .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 не использует атрибуты, указана в их FAQ :

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

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

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

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

2 голосов
/ 24 сентября 2010

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

1 голос
/ 02 марта 2010

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

1 голос
/ 26 сентября 2008

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

1 голос
/ 26 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...