2011-01-07 7 views
1

バージョン2.1から、NHibernateはIoCコンテナを介してIUserTypesのコンストラクタインジェクションをサポートしています(ByteCodeProvider設定で提供)。Fluent NHibernateでIoCコンストラクタインジェクション(空でないコンストラクタ)を使用するIUserTypeインプリメンテーションを使用する方法

しかし、Fluent NHibernateの設定(自動マッピングではない)でこれを実行しようとすると、私の設定をビルドするときに、私のオブジェクト(この例ではカスタムICompositeUserType)空のデフォルトコンストラクタを持つ

FluentNHibernate.Mapping.PropertyPart.AddColumnsFromCompositeUserType(タイプcompositeUserType)のActivator.CreateInstance()の呼び出しにこの例外をトレースしました。

NHibernateのIoCサポート機能の全ポイントは、Activator.CreateInstanceへの呼び出しを、指定されたカスタムByteCodeProviderの呼び出しで置き換えることでした。

私はFluent NHibernateでこれを動作させることが可能か、Fluent NH構成をスクラップして、NHibernateの組み込みのプログラム構成に戻る必要がありますか?この機能についての記事をブログに

リンク:

UPDATE:問題はICompositeUserTypeのカスタム実装のFluentNHibernateの取り扱いであるように見えます。コンポジット・ユーザー・タイプをIUserTypeに変更しました(これはおそらくクラスが実際にあったものに適しています)、Fluent NHibernateが現在協力しているように見えます。

UPDATE#2:空のコンストラクタを追加すると問題は解決しますが、これは回答としてマークしますが、提案は回答ではなくコメントになっています。加えた)。

+0

答えはわかりませんが、XBMと流暢なマッピングを自由に混ぜることができますので、FNH全体の作業を取り消す必要はありません。 – Jay

+1

デフォルトの空のコンストラクタ(publicまたはprotected)を指定するとどうなりますか? –

+0

@Jamie井戸、私はちょうどそれが聞こえるように、あなたの提案がリッチと私が以下で議論しているものであることを理解しました。私はそれを試して、報告を返すよ。 –

答えて

0

すべてのFluent NHibernateは、NHibernate XMLを利用するのと同じ設定オブジェクト構造を作成することに注意してください。どのようにFluent NHibernate経由でByteCodeProviderを設定しようとしていますか?

+0

今、NhEnvironment.BytecodeProvider = new MyCustomBytecodeProvider(_container)を呼び出しています。 fluentConfig.BuildConfiguration()の直前(例外がどこに来るか)です。私はFluent NHのソースから見ると、マッピング設定を生成するときにユーザータイプをインスタンス化するための条件付きロジックがなくてもActivator.CreateObject()を使用しているため、呼び出す場所は決して問題になりません。 –

+1

Fluent NHibernateが最初にICompositeUserTypeのインスタンス化を気にする理由は、私を混乱させました。ところで、GitHubコードでは、PropertyPartクラスは表示されませんが、Builders.PropertyBuilderクラスで言及しているメソッドが表示されます。私が推測しなければならないのであれば、コンベンションを行う必要があります。そのため、コンポジット型の適切な各プロパティには、それらにマップされた列があります。これを仮定すると、メタデータを収集するためのFluentコードによってのみ呼び出されるべきであるため、空のコンストラクタを追加することで問題はないようです。 NHibernate自体がうまくいけばIOCを使うだろう。 – Rich

+0

良い点ですが、今は私の無知を示​​して、2つのパブリックコンストラクタ(argsを持つものとないもの)を与えられたら、StructureMapのようなIoCコンテナは代わりに空のものを使用しますか?もしそうなら、FluentのActivator.CreateInstance()コールは、空のコンストラクタを保護すると、そのクラスで動作しますか? –

関連する問題