5

一般的な EF+MVC システムには、2 つまたは 3 つのレベルの検証があります。

  1. ViewModel の場合: 入力/物理検証 (DataAnnotations、FluentValidation)、つまり、長さ、null、範囲、正規表現など。
  2. モデルの場合: 入力/物理的検証 (MVC が使用されておらず、データが別のシステム、WCF、フォームなどから取得される場合は 1 を繰り返します)
  3. モデルの場合: 論理/「ビジネス ルール」の検証

実際のモデル/エンティティ/ドメイン/「ビジネス ルール」の 2+3 の検証に関するベスト プラクティスが見つかりません。私たちは次のいずれかを行います:

  • エンティティのプロパティ セッターに単純な検証ルールを配置します (ただし、これは非常に厄介です)。
  • EF のSaveChanges()にフックし、エンティティがAddedまたはModifiedの状態にある場合は、検証をトリガーします (エンティティ全体を一度に検証します)。

これは維持するのが難しいです。ViewModel の検証には多くの考慮が払われましたが、Model の検証はドメイン固有であるため、クリエイティブなソリューションを決定するのはユーザーであり、私のものはそれほど優れていません。

  • これを行うためのより良い方法や便利なツール (おそらく DataAnnotations や FluentValidation などですが、ドメイン エンティティ用) はありますか?
  • モデルの検証を行う、またはモデルの検証をトリガーするのに最適な場所はどこですか?
4

1 に答える 1

6

典型的な MVC+EF システムには 3 つのレイヤーがありますが、それらはあなたが話しているものではありません。

  1. プレゼンテーション層 (入力/出力)
  2. ビジネス層(論理層)
  3. データ層 (モデルは低レベルのデータを表す)

MVC はレイヤー 1 の検証を提供します。EF はレイヤー 3 の検証を提供します。レイヤー 2 の MVC または EF によって提供される検証機能はありません。そこで検証が必要な場合は、自分で行うか、サード パーティのビジネス オブジェクト フレームワークを使用する必要があります。 .

レイヤー 1 とレイヤー 3 の検証は別々ですが、多くの場合、それらは同様の検証を行う場合があります。その理由は、検証がさまざまな方法で、さまざまな要件で行われるためです。

たとえば、データベースに、データ モデリングまたはビジネス ロジックの理由で null 許容のフィールドがある場合があります (一部のデータが事前に読み込まれており、ユーザーがビジネス プロセスの一部としてフィールドを更新する必要があるとします)。データ レイヤーには null 可能であると表示されていますが、UI で必須にする必要があります。

編集:

簡単に言えば、データ モデルはビジネス ルールを強制するべきではありません。したがって、物理データ モデルに対して検証する場合を除いて、データ モデルでの検証は必要ありません (つまり、フィールドが null 許容の場合、モデルのデータ型は null 許容である必要があります。それ以外の場合は、そうではありません)。ほとんどの場合、(データ モデルの観点から) 無効なデータを物理的に挿入することはできません。これは、コード モデルで許可されていないためです。これに対する唯一の例外は文字列変数であり、明らかに物理モデルのサイズ制約をオーバーフローする可能性がありますが、それが発生した場合は例外がスローされます。

中間層であるビジネス レイヤーは、ビジネス ルールを検証する必要がある場所です (たとえば、顧客の注文書は文字で開始する必要があるなど)。MVC、Entity Framework、WCF、またはこの検証を行う方法を提供するものはありません。

ビジネス ルールは (理論的には) プレゼンテーション レイヤーの検証を推進する必要があるため、ここでは少し関係がありません。ただし、MVC にはそれを行うための機能が組み込まれていません。そのため、UI でビジネス ルールを複製することになります。

これに対処しようとするサードパーティのビジネス オブジェクト フレームワークが少なくとも 1 つあります。CSLA。ビジネス オブジェクトと UI を結び付けて検証を行うカスタム MVC モデル バインダーを提供しますが、これは MVC の組み込みの拡張性を使用してこれを行うだけです。

そのため、専用のビジネス オブジェクト フレームワークを使用したくない場合は、UI とビジネス レイヤーの間で検証を複製するか、独自のビジネス レイヤーで UI 検証を制御する独自の方法を見つけようとしています。

于 2012-10-11T06:13:37.950 に答える