メソッド属性で一般的なパラメーター検証を実行できる標準フレームワーク(おそらくEnterprise Library ...または.NET自体の一部)はありますか?
6 に答える
Microsoft Enterprise Libraryには、属性を使用した検証を可能にするMicrosoft.Practices.EnterpriseLibrary.Validationライブラリ/名前空間があります。
4.0 CTP 以降の .NET Framework の一部であり、スタンドアロン パッケージとして以前の .NET Framework バージョンで使用できるMicrosoft Code Contractsを使用すると、コーディングの前提条件を指定できます。これには、パラメーターを検証できる前提条件の指定が含まれます。
パラメータ チェックの使用例は次のとおりです (コード コントラクトのドキュメントからコピー)。
public Rational(int numerator, int denominator)
{
Contract.Requires(denominator ! = 0);
this.numerator = numerator;
this.denominator = denominator;
}
コード コントラクトを使用する利点は、将来の .NET Framework リリースの一部となるライブラリであるため、遅かれ早かれ、アプリケーション内の依存関係が 1 つ少なくなることです。
編集:引数チェックに属性を使用するライブラリを具体的に求めていることに気付きました...コード契約はそうではありません。Code Contracts が属性を使用しない理由は、FAQに記載されています。
カスタム属性を使用する利点は、コードにまったく影響を与えないことです。ただし、メソッド呼び出しを使用する利点は、一見自然に見える最初の属性の選択をはるかに上回ります。
ランタイム サポート:バイナリ リライターに依存しないと、属性で表現されたコントラクトを実行時に適用できません。これは、実行時に適用する前提条件 (またはその他のコントラクト) がある場合、コード内でコントラクトを複製するか、ビルド プロセスにバイナリ リライターを含める必要があることを意味します。Contract.RequiresAlways は、宣言型のコントラクトと実行時にチェックされる検証の両方として機能します。
解析の必要性: カスタム属性で使用できる値が制限されているため、条件は文字列としてエンコードされます。これには、すべてのソース言語に適した新しい言語を定義する必要があり、文字列を解析する必要があり、コンパイラが既に持っているすべての機能を複製する必要があります。
IDE サポートの欠如:文字列として表現されているため、Intellisense、型チェック、またはリファクタリングはサポートされていません。これらはすべて、コントラクトをコードとして作成するために使用できます。
Microsoftコードコントラクトはしばらくの間リリースされていますが、MS Researchでホストされており、構成(app.config / databaseなど)を使用してオン/オフを切り替えたり、ルールを変更したりすることはできません。私のライブラリBouncerは、宣言的なルール定義を提供します。エンティティクラス/プロパティレベルのルールのソースコードまたはapp.configエントリの属性です。ライブラリはLGPLの下でオープンソースです(商用製品で自由に使用できます)。app.configを使用してルールを構成すると、再コンパイルせずにルール設定を調整できます。
ASP.NET(およびASP.NET MVC)の動的データを使用すると、属性を使用してモデルプロパティの検証を行うことができます。
postsharpを使用して、検証用に独自の属性を実装することもできます。
PostSharp http://dpatrickcaldwell.blogspot.com/2009/03/validate-parameters-using-attributes.htmlを使用した例を次に示します。