ドメイン クラスを特別なプロパティで拡張せずに、NHibernate を介してエンティティを更新/挿入するときに、特別な列の値を設定するにはどうすればよいですか?
たとえば、すべてのテーブルには、CreatedBy、CreatedDate、UpdatedBy、UpdatedDate などの監査列が含まれています。しかし、これらのプロパティをドメイン クラスに追加したくありません。ドメイン モデルの永続性無視係数をできるだけ高く維持したいと考えています。
ドメイン クラスを特別なプロパティで拡張せずに、NHibernate を介してエンティティを更新/挿入するときに、特別な列の値を設定するにはどうすればよいですか?
たとえば、すべてのテーブルには、CreatedBy、CreatedDate、UpdatedBy、UpdatedDate などの監査列が含まれています。しかし、これらのプロパティをドメイン クラスに追加したくありません。ドメイン モデルの永続性無視係数をできるだけ高く維持したいと考えています。
NHibernateを数時間ハッキングした後、ドメイン層クラスをインフラストラクチャ層から分離しておく方法の妥協した解決策を見つけました。ここでの「犠牲者」は、以下のリストのポイント#1だけです。
1)プライベートフィールドが1つしかないドメイン内のすべての永続エンティティに、基本クラスDomainObjectを導入しました。
private IDictionary _infrastructureProperties = new Dictionary<object, object>();
2)クラスマッピングに次のセクションを追加しました。
<dynamic-component name='_infrastructureProperties' access='field'>
<property name='CreateBy' column='CreatedBy' />
<property name='CreateDate' column='CreatedDate' />
</dynamic-component>
3)これらのプロパティ値を設定するインターセプターを実装しました。
4)オプション。また、アプリケーションですべてのクラスが果たしている「ロール」の構成を使用して種類の設定を実装し、インターセプターでロール固有のプロパティを操作することもできます。たとえば、この構成では、ProductがTenantScopeObjectであり、インターセプターがTenantIDという名前のプロパティを現在のテナントIDの値に設定してシステムに記録される場合があります。
NHibernate の IUserType を調べてみてください。
次のページの下部にあるのは、ayende がエンティティからいくつかの暗号化ロジックを削除し、NHibernate がそれを処理できるようにする例です。
http://ayende.com/Blog/archive/2008/07/31/Entities-dependencies-best-practices.aspx
NH v2.0 以降では、イベント リスナーを使用してこれを行うのが非常に洗練されていることに注意してください。
例:
マニュアル:
http://knol.google.com/k/fabio-maulo/nhibernate-chapter-11-interceptors-and/1nr4enxv3dpeq/14
「これらのプロパティを追加しない」と同じではありませんが、前回これを見たとき、エンジニアは具体的なNHibernateクラスを実装し、嫌いなプロパティを実装した共通の抽象基本クラス(MyAuditableなど)から派生させることで対処しました。このようにして、問題を一度だけ解決する必要があります。