エンティティを構築するために NHibernate 2.0.1GA 内で使用される Activator.CreateInstance() への呼び出しを置き換える方法はありますか? 理想的には、StructureMap.ObjectFactory.GetInstance() に置き換えたいと思います。
3 に答える
コンストラクター注入ではこれを簡単に行うことはできません。NHibernate の内部では、ドメイン クラスから継承されたプロキシ オブジェクトを作成し、そこに遅延読み込みコードなどが散りばめられている必要がある場合があります。そのため、私の知る限り、オブジェクトの構築をオーバーライドする簡単なオプションはありません。
ただし、プロパティ セッター インジェクションを介してオブジェクトを構築するインターセプターを作成することで、依存性インジェクションを NHibernate でかなり簡単に動作させることができます。ここにその例があります。この例では、Windsor を DI コンテナーとして使用していますが、もちろん StructureMap でも同じことができます。
警告: ドメイン モデルに依存関係を注入することは、設計上の問題の兆候と見なされることが多く、多くの人がこれを避けています。そのため、コーディングを開始する前に、これが本当にやりたいことなのかを確認してください。
Fabio Maulo (現在の NHibernate リード開発者) からのこの投稿を見てください。彼は数か月前にこれを解決しました。コードは NHibernate 2.1 用ですが、IProxyFactoryFactory の部分を削除することで 2.0.1GA に移植できると思います。
IInterceptor を実装し、Objectfactory.BuildUp を使用して onload メソッドでインジェクションを行うことで、セッターインジェクションを行うことができます。これは簡単に実装できますが、setter インジェクションはあなたが望むものではないかもしれません。
独自の IBytecodeProvider と ReflectionOptimizer を実装することで、コンストラクターの挿入を行うことができます。これを行うのは少し難しいですが、可能です。
エンティティに何かを注入することはお勧めしません。99.9% のケースで、これは悪いデザインにつながり、デザインのレイヤリングが不可能になります。おそらく、0.01% のケースで、それが正しいことであることに直面しているでしょう。これは、goto ステートメントを入力するのと同じくらい頻繁に行うことです。