2017-01-05 9 views
1

usingステートメントの使用に関するいくつかの質問があります。私はそれが何をしているのか理解しています(私が正しいとすれば、それは開いている接続などをすべて破棄します)。しかし、私はそれを正しく使うべきか確信しています。Entity Frameworkで 'using'ステートメントを使用する正しい方法

私が取り組んでいるプロジェクトには、Entity Frameworkには必要ないリポジトリが含まれていません。

基本的に私のメソッドでは、Guidsのリストをパラメータとして取得しています。これらのIDはレストラン向けであり、これらのレストランで与えられたすべてのレビューを取得したい。

ので、現在、私はそうのようなリストを取得しています:

public void DoSomething(List<Guid> restaurantIds) 
{ 
    List<Review> reviews; 
    using (var db = new Context()) 
    { 
     reviews = db.Reviews.Where(x => restaurantIds.Contains(x.RestaurantId)).ToList(); 
    } 
    //More stuff here 
} 

が、これは使用した文の外でリストを宣言するために、共通の悪い習慣ですか?私はいくつかの代替案を考えましたが、私は何が良いか分かりません。

  1. 正確に同じクラスに別のメソッドを作成し、リストを返します。この方法で私のDoSomethingメソッドでは、私はちょうどこのように使用することができます:List<Review> reviews = GetReviewsFromRestaurants(restaurantIds);
  2. 私はまず文脈を作成し、使用ブロックなしでLINQ文を使用する必要があります。私は.Dispose()に電話しなければなりません。

私の例のようにusingステートメントを使用すると問題がありますか?もしそうなら、代わりの方が良いでしょうか?そうでない場合は、このリストをどのように取得するべきかの例を教えてください。

+0

悪い練習と呼んでいることを詳しく説明できますか? usingステートメント外の変数の宣言? – Reniuz

+0

はい、そうです。私は私のポストにそれを追加します。 – RandomStranger

+1

これは悪い習慣ではありませんが、コンテキストが破棄された後に読み込みナビゲーションプロパティを遅延させようとすると、この場合に問題が生じる可能性があります。 –

答えて

2

変数reviewsについては、usingブロックの外に宣言すると悪いとは思いません。

1.個別の方法を推奨します。実際には、以下のような基本操作をすべて処理するリポジトリクラス(RestaurantRepository)を使用することができます。単一の識別子または複数の識別子に基づいてすべてのレストランを取得する、新しいレストランを作成する、レストランのデータを変更する

これにより、ビジネスロジックを基本操作から分離することができます。

2.使い捨てのコンテキスト対明示的なDispose()。ディスポーザブルコンテキストは、コードが失敗してもDispose()が呼び出されることを確実にしているので、明らかに優れています。

より大きい絵 - エンティティフレームワークとコンテキストが

これは既にhere議論設けます。また、this articleは、disposeがそれほど必要ではないことを示しています。

私は個人的には、(さまざまなリポジトリ/エンティティ上で)複数の変更を許可するための作業単位パターンであり、コンテキストを処理しないと困ることはありませんでした。

+0

ええ、私はリポジトリに同意します。問題は、私が入っているチームがインターンではなく、自分の意思決定に大きな重みがないことです。 – RandomStranger

+0

明確なコードと再利用可能性を持つように基本的な操作を分離しているので、リポジトリパターンにはあまり意味がありません。 'DoSomething'はフィルタリングと「何か」の両方を行います。一部の他のメソッドが、フィルタリングされたレビューのリストで何か他のことをしたい場合は、それ自身でフィルタリングする必要があります。 – Alexei

+0

ああ、私は特にリポジトリは必要ありませんが、このクラスに別のメソッドを作成するのは良い方法でしょうか? – RandomStranger

0

通常、「悪い習慣とは何か」の回答は一切なく、あなたの質問も例外ではありません。頻繁にthareが明らかに悪い precticesと時には明らかに良いプラクティスですが、あなたの要件(あなたの要件、あなたの組織のルールやあなたのチームの経験など)に影響を与える多くの要因があります。

エンティティフレームワーク内のコンテキストをただちに保持することができます(ただし、は非常にで開いたままにしておくとよいでしょう)。しかし、あなたの文脈にusingを適用するという点で間違ったことはありません。 Webアプリケーションでは、コンテキストはしばしば非常に短時間の間しか使用されず、低レベルの接続プーリングでは、ソリューションは依然としてパフォーマンスを維持します。

3

ここでは、中カッコは独自のスコープを定義します。中括弧の範囲外で宣言する変数は中括弧内に表示され、大丈夫です。

実際にはtry catchブロックの省略形です。

List<Review> reviews; 
var db = new Context(); 
try 
{ 
    reviews = db.Reviews.Where(x => restaurantIds.Contains(x.RestaurantId)).ToList(); 
} 
finally 
{ 
    db.Dispose(); 
} 

あなたのスニペットはこれよりはるかに簡潔です。コンパイラは "used"オブジェクトに対して常に.Disposeを呼び出します。

関連する問題