2012-05-03 11 views
1

エンティティフレームワーク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参照例外)を入力しようとしました"のような何かを叫んだ。 誰かが私が間違っていることの考えを持っていますか?汎用リポジトリパターンで接続を管理する

答えて

1

開始要求、上で見つける

パターンを避ける必要があります。すべての種類の副作用(例えば、破棄された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はリクエストの最後にリポジトリを破棄します。

+0

私のリポジトリのコンストラクタはdbContextを取得し、ninjectはdbcontextをリポジトリクラスはコントローラで呼び出されますか? –

+0

さらに、私はこの記事のようにGeneric Repositoryを使用しています:http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangleそこにリポジトリコンストラクタを使用できますか? –

+0

はい。私はあなたのリポジトリのコンストラクタがdbContextを受け入れるべきであることを意味します。次に、NInjectを使用してInRequestScope(各要求に対して1つの共有dbContextが存在することを意味する)を持つdbContextを挿入すると、それは機能するはずです。私が見る限り、GenericRepositoryは、リポジトリごとに作成するのではなく、コンストラクタでdbContextを取得するように変更する必要があります。 –

0

私はあなたの質問をしているかどうかわかりませんが、あなたのリポジトリは単一のdbcontextを持つ「作業ユニット」内で作業できるはずです。私はこの作業単位を開始するのに最適な場所は、Singletonパターンは、抗あることができますあなたのglobal.asaxでのセットアップ(と涙ダウンのため終了要求)

+0

「作業単位」はまだ試していないものです。なぜ、 "single Ton"パターンを使用しようとしたときにnull参照(処理されたオブジェクトにアクセスしようとしている)があるのか​​教えてください。 –