5

ここからPagedList.Mvcライブラリを試しています

https://github.com/TroyGoode/PagedList

この使用例がある

var products = MyProductDataSource.FindAllProducts(); //returns IQueryable<Product> representing an unknown number of products. a thousand maybe?

        var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
        var onePageOfProducts = products.ToPagedList(pageNumber, 25); // will only contain 25 products max because of the pageSize

MyProductDataSource.FindAllProducts(); の典型的な実装。の線に沿っている

public IQuerable<T> MyProductDataSource.FindAllProducts()
{
   using ( var ctx = new MyCtx() )
   {
       return ctx.MyList().Where( .... );
   }
}

もちろん、これには InvalidOperationException() があり、DBContext は既に破棄されていますというメッセージ

ここで問題なく使用できる IQueryable を返す方法のベスト プラクティスをお探しですか?

4

2 に答える 2

4

IoC コンテナーを使用して、 HTTP 要求ごとに DbContext の有効期間を維持することをお勧めします。ほとんどの IoC コンテナーは HttpRequest の有効期間をサポートしています。

IQueryableしたがって、上位層で使用できる DbContext のスコープを活用できます。

autofacninjectの 2 つの IoC コンテナーについて詳しく説明します。

ここでautofacがMVCをサポートする方法

または、ここでNInjectがMVCをサポートする方法

IoC コンテナーを初めて使用する場合は、Martin Flowerの依存性注入の基本概念を確認することをお勧めします。次に、選択した IoC コンテナーの 1 つを使用します。

IQueryableただし、使用方法とサポートを停止するレイヤーには十分注意する必要があります。そうでない場合、背後にある悪魔、エンティティ フレームワークからの遅延読み込みにより、パフォーマンスが低下します。IQueryable私のルールの 1 つは、 View でサポートしないことです。

于 2013-05-08T18:03:27.307 に答える
3

データ コンテキストの範囲を「上に移動」する必要があります。

public IQueryable<T> MyProductDataSource.FindAllProducts(MyCtx context)
{
    return context.MyList().Where( .... );
}

次に、より大きなスコープでコンテキストを作成します。

using (var ctx = new MyCtx())
{
    var products = MyProductDataSource.FindAllProducts(ctx);

    var pageNumber = page ?? 1;
    var onePageOfProducts = products.ToPagedList(pageNumber, 25);
}
于 2013-05-08T18:00:08.760 に答える