Существует ли стандартная структура (возможно, часть самой Enterprise Library ... или сама .NET), которая позволяет выполнять общую проверку параметров в атрибутах метода?Существует ли стандартная среда для проверки параметров .NET, которая использует атрибуты?
ответ
Microsoft Code Contracts, которые являются частью .NET Framework с 4.0 CTP и доступны для более ранних версий .NET Framework в виде автономного пакета, позволяют указывать предположения о кодировании. Сюда входит указание предварительных условий, которые могут проверять параметры.
Пример использование для проверки параметров будет (копируется из Code Contracts documentation):
public Rational(int numerator, int denominator)
{
Contract.Requires(denominator ! = 0);
this.numerator = numerator;
this.denominator = denominator;
}
Преимущества использования коды контрактов является то, что это библиотека, которая будет частью будущих релизов .NET Framework, так что рано или позже у вас будет меньше зависимости от вашего приложения.
EDIT: Только что заметил, что вы специально запрашиваете библиотеку, которая использует атрибуты для проверки аргументов ... что в контрактах кода нет. Причина, почему контракты код не использует атрибуты перечислены в их FAQ:
Преимущество использования пользовательских атрибутов является то, что они не влияют на код вообще. Однако преимущества использования метода требует намного перевешивают, казалось бы, естественный первый выбор атрибутов:
Продолжительность поддержки: Вне зависимости от бинарной Rewriter, контракты, выраженные с атрибутами не может быть приведено в исполнение во время выполнения. Это означает, что если есть предварительные условия (или другие контракты), которые вы хотите применить во время выполнения, вам нужно либо дублировать контракты в коде, либо включить в процесс сборки двоичный перезаписыватель. Contract.RequiresAlways служит как декларативный контракт, так и как проверенная временем проверка.
Потребность в разборе: Поскольку значения, которые могут использоваться с пользовательскими атрибутами, ограничены, условия в конечном итоге кодируются как строки. Это требует определения нового языка, который подходит для всех исходных языков, требует, чтобы строки обрабатывались, дублируя все функциональные возможности, которыми обладает компилятор.
Отсутствие поддержки IDE: Выраженные в виде строк, нет поддержки Intellisense, проверки типа или рефакторинга, все из которых доступны для создания контрактов в качестве кода.
Dynamic Data для ASP.NET (и ASP.NET MVC) позволяет выполнять проверку свойств модели с использованием атрибутов.
Библиотека Microsoft Enterprise имеет библиотеку Microsoft.Practices.EnterpriseLibrary.Validation/пространство имен, которое позволяет проверять использование атрибутов.
Спасибо !!!! <- несколько! из-за требования 10 символов :) – 2008-09-26 08:01:08
Вы также можете использовать postsharp и реализовать свои собственные атрибуты для проверки.
Вот пример использования PostSharp http://dpatrickcaldwell.blogspot.com/2009/03/validate-parameters-using-attributes.html
Хотя контракты Microsoft Кодовые на некоторое время, они по-прежнему размещены в MS Research, и вы не можете использовать конфигурацию (app.config/базы данных и т.д.) в включать/выключать или даже изменять правила. Моя библиотека Bouncer действительно содержит определение декларативного правила: атрибуты в исходном коде или приложении.config для правил на уровне сущности/уровне собственности. Библиотека открыта в рамках LGPL (вы можете свободно использовать ее в коммерческих продуктах). Если вы настраиваете правила через app.config, вы можете настроить параметры правила без необходимости перекомпиляции.
хорошие пункты re: attributes – 2010-03-13 20:09:47