エンティティ フレームワーク 4.1 と mvc3 を使用してサイトを構築しています。私は汎用リポジトリ パターンを使用しています:
http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle。ninject
具体的なリポジトリをコントローラーに注入するために使用します。私の問題は、それぞれの dbcontext が異なり、「同じクエリで異なるコンテキストを使用することはできません」などのコードを叫ばないと複雑なクエリを実行できないことです。「シングルトン」アプローチを使用しようとしましたが、コードは「破棄されたオブジェクトを入力しようとしました(null参照例外)」のようなものを叫びました。誰かが私が間違っていることを知っていますか?
2 に答える
Singleton パターンは避けるべきアンチパターンです。これにより、あらゆる種類の副作用 (破棄された DbContext など) を伴うコードのテストが困難になります。
UnitOfWork は、さまざまなリポジトリでの操作を管理します。行われたすべての変更を追跡し、それらの変更を正しい順序でデータベースに書き込みます。DbContext は既に UnitOfWork パターンを実装しています (ただし、DbContext をカスタム UnitOfWork インターフェイスの背後に隠す方が適切です)。
すでに NInject を使用して依存性注入を使用している場合は、ほとんど同じです。DbContext を受け取るようにリポジトリのコンストラクタを変更する必要があります。
public class MyRepository
{
private _unitOfWork;
public MyRepository(DbContext unitOfWork)
{
_unitOfWork = unitOfWork;
}
....
}
次に、DbContext をInRequestScope モードで NInject に接続すると、すべてが機能するはずです。DbContext はすべてのリポジトリで共有され、Ninject はリクエストの最後にそれを破棄します。
あなたの質問を受け取っているかどうかはわかりませんが、リポジトリは単一の dbcontext を持つ「作業単位」内で動作できるはずです。
この作業単位を開始するのに最適な場所は、global.asax で設定できる begin 要求です (および、tear down の end 要求)。