PreTranctionCommintイベントでNhibernate検証フレームワークを使用してドメインモデルを検証することは可能ですか?可能であれば、このイベントをどのように書くことができますか?
3 に答える
Nhibernate 検証フレームワークでドメイン モデルを検証することは可能ですか?
本当にドメイン モデルがある場合は、検証フレームワークは必要ありません。言い換えれば、オブジェクトは動作をカプセル化し、外部の魔法の検証フレームワークに依存することなく、内部の不変条件を保護します。そもそもドメイン オブジェクトが「無効」な状態になることはありません。それらが長命である場合、それらは「常に持続可能」であるべきです。ドメイン オブジェクトの有効性は、データ アクセス ライブラリによって発生する場合と発生しない場合があるイベントに依存するべきではありません。VALIDATION は過度に一般化されており、コンテキストに依存しているため、VALIDATION について考えずに、代わりにビジネス オブジェクトの INVARIANTSについて考えてみるとよいでしょう。. オブジェクトに不変条件を適切に適用するために、サードパーティのフレームワークは必要ありません。ドメインクラスを検証フレームワークに結合せずに実装することは、実際には難しくありません。
しかし、質問を次のように言い換えると:
Nhibernate 検証フレームワークで貧血ドメイン モデルを検証することは可能ですか?
その場合、答えは次のようになります。ただし、複雑さが増すにつれて、複数のオブジェクト フィールドや個別のドメイン サービスなどを含む、より複雑なドメイン ルールを適用する必要があることに注意してください。「カスタム バリデータ」を記述して検証フレームワークにますます結合するか、単にあきらめるかのいずれかになります。そして、フレームワークによって実装されたいくつかのルールと、コードベース全体に広がる他のルールになります。この回答とDDD全般を見る価値があるかもしれません。
http://nhforge.org/wikis/validator/nhibernate-validator-1-0-0-documentation.aspxからの抜粋
Hibernate イベントベースの検証
NHibernate Validator には、組み込みの NHibernate イベント リスナーが 2 つあります。PreInsertEvent または PreUpdateEvent が発生するたびに、リスナーはエンティティ インスタンスのすべての制約を検証し、違反している場合は例外をスローします。基本的に、オブジェクトは、NHibernate によってトリガーされる挿入と更新の前にチェックされます。これにはカスケード変更が含まれます。これは、検証プロセスを有効にする最も便利で簡単な方法です。制約に違反した場合、イベントは、各失敗を説明する InvalidValues の配列を含むランタイム InvalidStateException を発生させます。