DataBase
派生コントローラーがアクセスできるプロパティを公開するベースコントローラーを使用します。
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
私のアプリケーションのすべてのコントローラーは、次のように派生しBaseController
て使用されます。
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
今あなたの質問に答えるために:
いつ新しいDbContextを作成する必要がありますか/渡すグローバルコンテキストを1つ持つ必要がありますか?
コンテキストはリクエストごとに作成する必要があります。コンテキストを作成し、それを使って必要なことを実行してから、それを取り除きます。私が使用する基本クラスのソリューションでは、コンテキストの使用について心配するだけで済みます。
グローバルコンテキストを試してはいけません(これはWebアプリケーションの動作方法ではありません)。
すべての場所で再利用する1つのグローバルコンテキストを持つことはできますか?
いいえ、コンテキストを維持すると、すべての更新、追加、削除などが追跡され、アプリケーションの速度が低下し、アプリケーションに非常に微妙なバグが発生する可能性があります。
おそらく、リポジトリまたはコンテキストのいずれかをコントローラに公開することを選択する必要がありますが、両方を公開することはできません。同じメソッドから2つのコンテキストにアクセスすると、両方がアプリケーションの現在の状態について異なる考えを持っている場合、バグが発生します。
個人的には、私が見たほとんどのリポジトリの例は、とにかくDbContext
薄いラッパーとして終わるので、直接公開することを好みます。DbContext
これによりパフォーマンスが低下しますか?
初めてaDbContext
を作成するのはかなり費用がかかりますが、一度作成すると多くの情報がキャッシュされるため、その後のインスタンス化がはるかに高速になります。データベースにアクセスする必要があるたびにコンテキストをインスタンス化するよりも、コンテキストを維持することでパフォーマンスの問題が発生する可能性が高くなります。
他のみんなはどうやってこれをやっていますか?
場合によります。
一部の人々は、依存性注入フレームワークを使用して、コンテキストの具体的なインスタンスが作成されたときにコントローラーに渡すことを好みます。どちらのオプションでも問題ありません。Mineは、使用されている特定のデータベースが変更されないことがわかっている小規模なアプリケーションに適しています。
これを知ることができないと主張する人もいるかもしれません。そのため、アプリケーションの変更に対する耐性が高まるため、依存性注入方式の方が優れています。これについての私の意見は、おそらく変更されないだろう(SQLサーバーとEntity Frameworkはほとんどわかりにくい)、そして私の時間は私のアプリケーションに固有のコードを書くのに最もよく費やされるということです。