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