1

エンティティを構築するために NHibernate 2.0.1GA 内で使用される Activator.CreateInstance() への呼び出しを置き換える方法はありますか? 理想的には、StructureMap.ObjectFactory.GetInstance() に置き換えたいと思います。

4

3 に答える 3

4

コンストラクター注入ではこれを簡単に行うことはできません。NHibernate の内部では、ドメイン クラスから継承されたプロキシ オブジェクトを作成し、そこに遅延読み込みコードなどが散りばめられている必要がある場合があります。そのため、私の知る限り、オブジェクトの構築をオーバーライドする簡単なオプションはありません。

ただし、プロパティ セッター インジェクションを介してオブジェクトを構築するインターセプターを作成することで、依存性インジェクションを NHibernate でかなり簡単に動作させることができます。ここにその例があります。この例では、Windsor を DI コンテナーとして使用していますが、もちろん StructureMap でも同じことができます。

警告: ドメイン モデルに依存関係を注入することは、設計上の問題の兆候と見なされることが多く、多くの人がこれを避けています。そのため、コーディングを開始する前に、これが本当にやりたいことなのかを確認してください。

于 2009-04-15T18:44:58.327 に答える
2

Fabio Maulo (現在の NHibernate リード開発者) からのこの投稿を見てください。彼は数か月前にこれを解決しました。コードは NHibernate 2.1 用ですが、IProxyFactoryFactory の部分を削除することで 2.0.1GA に移植できると思います。

于 2009-04-15T22:43:11.483 に答える
1

IInterceptor を実装し、Objectfactory.BuildUp を使用して onload メソッドでインジェクションを行うことで、セッターインジェクションを行うことができます。これは簡単に実装できますが、setter インジェクションはあなたが望むものではないかもしれません。

独自の IBytecodeProvider と ReflectionOptimizer を実装することで、コンストラクターの挿入を行うことができます。これを行うのは少し難しいですが、可能です。

エンティティに何かを注入することはお勧めしません。99.9% のケースで、これは悪いデザインにつながり、デザインのレイヤリングが不可能になります。おそらく、0.01% のケースで、それが正しいことであることに直面しているでしょう。これは、goto ステートメントを入力するのと同じくらい頻繁に行うことです。

于 2009-04-15T19:01:59.737 に答える