3

Entity Framework CTP5では、取得した永続エンティティをIOCコンテナ経由で構築することは可能ですか?Entity Framework CTP5とNinjectをIOCとして使用する

私はNinjectを使用していますが、MVCでうまく結びついていますが、いくつかのビジネスルール用に構築されたドメインオブジェクトにいくつかのサービスを注入する必要があります。

私はむしろ、メソッドやプロパティの注入よりもコンストラクタの注入を使用してこれを行うでしょう。

答えて

1

私はここで達成しようとしていることは正確にはわかりませんが、EFには拡張性の点はほとんどありません。あなたができることは、ObjectContextによって起動されたObjectMaterializedイベントにフックすることです。 CTP5では、あなたDbContextのコンストラクタにそのようなあなたのDbContextをキャストする必要があります。

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
    this.ObjectContext_OnObjectMaterialized; 

そしてあなたの機能ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e)を実装します。残念ながら既にオブジェクト化されているオブジェクトにアクセスすることができます。あなたのニーズに応じて、ここでいくつかの面白い振る舞いをハックすることができます。

ところで、この文は私には意味がありません:

私は、彼らはいくつかのビジネスルールのために構築されたときに、私のドメインオブジェクトにいくつかのリポジトリを注入する必要があります。

これは永続性無視ドメインオブジェクトには向いていませんか?

+0

単語リポジトリはサービスであったはずです(私は自分のオリジナルを更新しました)。例えば、ドメインオブジェクトにはいくつかの電子メール送信機能があるかもしれないので、私は建設中に電子メールサービスを注入したいと思います。 – WDuffy

+0

@WDuffy - 意味がある。残念ながら、MSフォーラムのこの応答(http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/c33019e9-2ac4-4cc6-9e0b-3c6557fbf0a6)は、EFにはゼロ引数のコンストラクタが必要であるため、あなたのPOCOを実体化し、古典的なコンストラクタインジェクションを使用することはできません。回避策は、1)このコンストラクタを内部にする、2)このコンストラクタをIoCコンテナによって解決されたHAS引数を持つコンストラクタを呼び出すことです。これは残念なことにIOCの懸念からあなたのPOCOを汚染します。 – anon

+0

ICustomerRepositoryインターフェイスは永続性を無視します。 DDDの青い本を読んだら、Eric Evansがいくつかの詳細なシーケンス図でこれを行うことさえ気づくでしょう。本当にリポジトリであり、魅力的なデータアクセスオブジェクトではない場合、これはリポジトリのポイントです。私は個人的に私の集合的なルーツのリポジトリインターフェイスを使用し、それは素晴らしい作品です。 –

1

私はあなたがしようとしていることの逆をする傾向があります。私はドメインオブジェクトをできるだけ無知にしています(基本的にプロパティバッグです)。電子メールを送信するなど、何らかのアクションを実行する必要がある場合、サービスを使用して、そのメソッドがアクションを実行するために必要なドメインオブジェクトを取得するようにします。この場合、アプリケーションのさまざまな部分にサービスを注入するだけで済みます(これはNinjectを使用する方が簡単です)。

+0

多少オフトピック:「プロパティバッグ」は驚きです。つまり、あなたは貧血ドメインを作成する危険性があります。 非常にオフトピック:クールなアバター=) – anon

+0

私は両側に(そしてある程度は両側を主張して)利益を見ます。私はオブジェクトの単純な検証を維持する傾向があります。その意味では、それらは厳密にプロパティバッグではないと思いますが、オブジェクトが十分に複雑であれば、ビジネスロジックを置くことでクラスが急速に膨張し、コードの(私はそれがたくさん起こるのを見た)。私が "ビジネスロジック"という言葉を考えるとき、私は複雑な一連のルールを考える傾向があります。もしそれが別のクラスを好む場合は、単にバリデーションであれば、それをクラスに入れるのは合理的です。いつもブラックメイジが大好き! –

+0

+1。私はまったく同じです。私はPOCOをロジックフリーにしています(セッターの検証は非常に簡単です)。電子メールの送信のような懸念は、実際にサービス層に属しています。ドメインオブジェクトへのサービスの注入は直感的ではないようです。 –

0

私はEFコードの最初のCTP 5は何らかの助けになると思います。これはValidationContextオブジェクトを引数として取るIValidatableObjectインターフェイスを尊重します。 ValidationContextはServiceLocatorであるため、validationContextオブジェクトを使用してIoCコンテナのインスタンスを取得できる必要があります。 (これは私の最初の考えですが、私は何も試していません)。申し訳ありませんが、私の英語はあまり理解できません。

更新 申し訳ありませんが、私は質問は、私が理解するものよりもかなり異なっていることに気づき、このコメントを投稿した直後。だから、私は自分でいくつかのことを試してみました。ヒットと試練の後、さらに多くのグーグルが出て、私はどこかに行くことができました。私は答えをここに掲示するつもりだったが、答えは非常に長いので、それに反対して考えた。だから、私は代わりにこのブログを投稿しました。

http://nripendra-newa.blogspot.com/2011/02/entity-framework-ctp5-injecting-with.html

これは同じ探していくつかのGooglerを助けるかもしれないように。今回は質問があることを願っています。

関連する問題