0

アプリケーション dat にリポジトリ パターンを実装しました。

私は持っている :

public class EFRepository<T>
{
    DbContext // My db context

    public IQureable<T> GetQuery()
    {
        DataContext.CreateQuery(...);
    }
}

ここで、ユーザー リポジトリがあるとします。

public class UserRepository : EFRepository { public UserGetUserDetails(int userId) { GetQuery().Where(u=>u.Id = userId).First(); } }

私の問題はDbContext、派生リポジトリで EF リポジトリを使用する場合のリリース方法です。としましょう :UserRepository: EFRepositoryを使用しGetQuery、コンテキストを破棄する必要があります。

これを一般的なリポジトリで作成する方法はありますか?

4

2 に答える 2

1

どのような作業単位があるかを考える必要があります。(インターネット上には他にも多くのチュートリアルがあります)。アイデアは、同じdbcontext を保持し、同じ作業単位内にある間にそれを再利用することです。このようにして、エンティティは必要なときにすでにコンテキストにアタッチされています。

さて、これは Web アプリケーションなので、この場合の作業単位はリクエストになります。同じリクエストで、DBContext を再利用します。これを行うには多くの方法がありますが、私の頭の一番上にあるものです。コンテキストを処理する「OnActionExecuting」のようなものが必要になるでしょう。

しかし、さらに良いのは、制御の反転パターンを使用することです (これを使用する多くのフレームワークがあります。私は主にNInjectを使用します。これにより、必要に応じて、提案したスコープに応じて、特定のクラスの新しいインスタンスが自動的に作成されます-この場合は「onRequestScope」 IoC についてはさらに多くのことを言いますが、質問の範囲ではありません

于 2012-11-08T07:16:07.433 に答える
0

私は過去に同様のパターンを使用しましたが、私の場合は実際に から継承しDbContext、それ自体が を実装していますIDisposable。ブロックで使用している、EFRepositoryまたはそれから派生したクラスを使用している場合は、問題ありません。using

DbContextメンバー変数を使用する場合は、そのメソッドEFRepositoryを実装IDisposableして呼び出す必要があります。DbContext.Dispose()Dispose

于 2012-11-05T22:54:56.517 に答える