2011-01-31 12 views
5

正直私はC#とAsp.net MVCの初心者です。 asp.net Webアプリケーションが実際にIISとASP.NETフレームワークの背後でどのように動作するのかもわかりません。コントローラクラスのDbContextのインスタンスフィールドに対して、Global.asaxのDbContextの静的フィールド?

私は、私のasp.net mvcアプリケーションでDbContext(またはDbContextから派生した任意のクラス)のフィールドを宣言しなければならないという決定に混乱します。

私は2つの選択肢があります。

  1. は、すべてのコントローラがそれを利用できるようglobal.asax内部の静的フィールドとしてフィールドを宣言します。
  2. フィールドを各コントローラクラス内のインスタンスフィールドとして宣言します。

どちらが正しいか説明できますか?より詳細な説明が本当に必要です。

答えて

8

global.asaxで静的フィールドにすると、並行性の問題が発生します。複数の要求からの複数のスレッドが入って互いのデータを取得できます。さらに悪いことは、ウェブサイトでトラフィックが増加し始めるまで、または負荷テストを開始するまで表示されないことです。シングルトンとして実装すると、すべてがテストでうまくいくでしょう。「私は天才です!この実装がどれほどクリーンなのか見てください!しかし、いつか、私が行ったように、あなたはこれで燃え尽きるでしょう。結果は混乱し、ユーザーは自分に属していないデータの表示を開始し、Webサイトは予期せぬ動作をします。

Entity FrameworkとLINQ to SQLの両方のコンテキストクラスは、軽量インスタンシエーションとなるように設計されています。これは、実行するクエリのセットごとに設定するものです。それは長生きするためのものではありません。私は、アプリケーション全体の(DbContextから派生またはクラス)DbContextの単一のインスタンスを利用する場合

Check out this other Stack Overflow question/answer on the same topic, worded differently.

4

2番目のオプションを使用してください。コントローラで宣言して使用します。 DBContextをglobal.asaxの静的フィールドとして配置すると、基本的にはアプリケーション全体の単一インスタンスになります。

一方、2番目のオプションでは、リクエストごとにDBコンテキストがあります。依存関係インジェクションを使用して各アクションメソッドでDBContextを取得できる方が良いでしょう。

+0

は、欠点は何ですか? – LaTeX

+2

@Stack Overflow - データベース接続の点で「シングルトン」を読み、それがなぜ悪いのかを読んでください。 – RPM1984

関連する問題