Entity Framework CTP5 で、取得した永続エンティティを IOC コンテナ経由で構築することは可能ですか?
私は Ninject を使用しており、MVC とうまく連携していますが、一部のビジネス ルール用に構築されたドメイン オブジェクトにいくつかのサービスを注入する必要があります。
メソッドやプロパティのインジェクションよりも、コンストラクターのインジェクションを使用してこれを行いたいと思います。
Entity Framework CTP5 で、取得した永続エンティティを IOC コンテナ経由で構築することは可能ですか?
私は Ninject を使用しており、MVC とうまく連携していますが、一部のビジネス ルール用に構築されたドメイン オブジェクトにいくつかのサービスを注入する必要があります。
メソッドやプロパティのインジェクションよりも、コンストラクターのインジェクションを使用してこれを行いたいと思います。
ここで何を達成しようとしているのか正確にはわかりませんが、EF には拡張ポイントがほとんどありません。最善の方法は、ObjectContext によって発生する ObjectMaterialized イベントにフックすることです。CTP5 では、DbContext のコンストラクターで次のように DbContext をキャストする必要があります。
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
this.ObjectContext_OnObjectMaterialized;
次に、関数を実装しますObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
。残念ながら、すでに具体化されているオブジェクトにアクセスできます。必要に応じて、ここで興味深い動作をハックできる場合があります。
ところで、この文は私には意味がありません:
ドメイン オブジェクトがビジネス ルール用に構築されている場合、いくつかのリポジトリをドメイン オブジェクトに挿入する必要があります。
これは永続性を無視したドメイン オブジェクトに反しませんか?
私はあなたがやろうとしていることの逆をする傾向があります. 私は自分のドメイン オブジェクトをできる限り無知にしています (それらは基本的にプロパティ バッグです)。電子メールの送信など、何らかのアクションを実行する必要がある場合は、そのためのサービスを使用して、アクションを実行する必要があるドメイン オブジェクトをメソッドに取り込ませます。この場合、アプリケーションのさまざまな部分にサービスを注入するだけで済みます (Ninject を使用すると、はるかに簡単に実現できます)。
EF コード ファースト CTP 5 が役立つと思います。これは、ValidationContext オブジェクトを引数として受け取る IValidatableObject インターフェイスを尊重します。ValidationContext は ServiceLocator であるため、validationContext オブジェクトを使用して IoC コンテナーのインスタンスを取得できるはずです。(これは私の最初の考えにすぎませんが、何も試していません)。私の英語があまり理解できない場合は、申し訳ありません。
更新 申し訳ありませんが、このコメントを投稿した直後に、質問が私が理解したものとはかなり異なることに気付きました。それで、私は自分でいくつかのことを試してみました.ヒットと試行錯誤とさらに多くのグーグル検索の後、私はどこかにたどり着くことができました. ここに回答を投稿する予定でしたが、回答が非常に長くなるため、反対しました。というわけで、代わりにこのブログを投稿しました。
http://nripendra-newa.blogspot.com/2011/02/entity-framework-ctp5-injecting-with.html
これは、同じものを検索している一部のグーグルユーザーに役立つかもしれません。今回は質問が正しかったことを願っています。