2009-04-15 3 views

答えて

4

これはコンストラクタインジェクションでは簡単に実行できません。 Hibernate内部では、ドメインクラスから継承したLazyローディングコードなどを継承したプロキシオブジェクトを作成する必要があります。私の知る限り、オブジェクトの構築をオーバーライドする単純なオプションはありません。

あなたですが、プロパティセッター注入を介してオブジェクトを構築するインターセプターを書くことで、かなり簡単にNHibernateで動作する依存性注入を取得します。このhereの例があります。この例ではDIコンテナとしてWindsorを使用していますが、もちろんStructureMap-here are the relevant docs for StructureMapで同じことを行うことができます - 「Setter Injectionを既存のオブジェクト(BuildUp)に適用する」を参照してください。

警告:ドメインモデルへの依存関係を注入することは、設計上の問題の症状としてよく見られます。多くの人がこれを避けるため、コーディングを開始する前にこれを実行してください。

+0

コンストラクタの注入が可能です – Paco

+0

私はそれが不可能だとは言わなかった、簡単ではないと私は言った。私が間違っているなら、私に教えてください:) –

+0

それから私はよく読んでいません。ごめんなさい。 – Paco

1

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

独自のIBytecodeProviderとReflectionOptimizerを実装して、コンストラクタインジェクションを実行できます。これは少し難しいですが、可能です!

実体に物を注入することはお勧めしません。ケースの99.9%で、これはデザインが悪くなり、デザインのレイヤーを不可能にします。たぶんあなたは、それが正しいことであるケースの0.01%に直面するかもしれません。 goto文を入力するのと同じくらい頻繁に行うことです。

2

this post from Fabio Maulo(現在のNHibernate lead dev)を見てください。数ヶ月前にこれを解決しました。このコードはNHibernate 2.1用ですが、IProxyFactoryFactoryの部分を削除することで2.0.1GAにバックポートすることができると思います。

関連する問題