エンティティフレームワーク4.1とmvc3を使用してサイトを構築しています。私はGeneric Repositoryパターンを使用しています:
http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangle私はninject
を使ってコンセントのリポジトリをコントローラに注入します。 私の問題は、それぞれのdbcontextが異なっていて、「異なるクエリを同じクエリで使用できない」というようなコードを使わずに複雑なクエリを実行できないことです。私は "シングルトン"アプローチを使用しようとしましたが、コードは "配置されたオブジェクト(null参照例外)を入力しようとしました"のような何かを叫んだ。 誰かが私が間違っていることの考えを持っていますか?汎用リポジトリパターンで接続を管理する
答えて
開始要求、上で見つける
パターンを避ける必要があります。すべての種類の副作用(例えば、破棄されたDbContext)を持つコードをテストすることは難しくなります。
UnitOfWorkは、異なるリポジトリの操作を管理します。それは行われたすべての変更を追跡し、正しい順序でそれらの変更をデータベースに書き込みます。 DbContextはすでにUnitOfWorkパターンを実装しています(カスタムUnitOfWorkインターフェイスの背後にあるDbContextを隠す方がいいかもしれませんが)。
すでに依存性注入トラフNInjectを使用している場合、あなたはほとんど彼らです!あなたはDbContextを取るために、あなたのリポジトリのコンストラクタを変更する必要があります。
public class MyRepository
{
private _unitOfWork;
public MyRepository(DbContext unitOfWork)
{
_unitOfWork = unitOfWork;
}
....
}
あなたが動作するはずInRequestScope modeすべてにNInjectにDbContextを配線します。 DbContextはすべてのリポジトリで共有され、Ninjectはリクエストの最後にリポジトリを破棄します。
私はあなたの質問をしているかどうかわかりませんが、あなたのリポジトリは単一のdbcontextを持つ「作業ユニット」内で作業できるはずです。私はこの作業単位を開始するのに最適な場所は、Singletonパターンは、抗あることができますあなたのglobal.asaxでのセットアップ(と涙ダウンのため終了要求)
「作業単位」はまだ試していないものです。なぜ、 "single Ton"パターンを使用しようとしたときにnull参照(処理されたオブジェクトにアクセスしようとしている)があるのか教えてください。 –
私のリポジトリのコンストラクタはdbContextを取得し、ninjectはdbcontextをリポジトリクラスはコントローラで呼び出されますか? –
さらに、私はこの記事のようにGeneric Repositoryを使用しています:http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangleそこにリポジトリコンストラクタを使用できますか? –
はい。私はあなたのリポジトリのコンストラクタがdbContextを受け入れるべきであることを意味します。次に、NInjectを使用してInRequestScope(各要求に対して1つの共有dbContextが存在することを意味する)を持つdbContextを挿入すると、それは機能するはずです。私が見る限り、GenericRepositoryは、リポジトリごとに作成するのではなく、コンストラクタでdbContextを取得するように変更する必要があります。 –