2017-05-18 16 views
0

すべて、私はのようなコード書いていますASP.NETコントローラ+ Entity Framework Context =スレッドセーフ?

public class UserController : AuthenticatedController 
{ 

    private MunicipalContext db = new MunicipalContext(); 

    // GET: Users/Edit/5 
    public ActionResult Edit(int? id) 
    { 
     //Do stuff with db.Users 
    } 

    // Other action methods that do stuff with db.Users 
} 

は、Javaの背景から来るが、これはサーブレットとインスタンス・フィールドのように感じていると、私の頭の後ろにその賑やか感を高めるために始めています。

私はスレッドの安全性の問題に遭遇しますか?

+0

いいえ、それぞれの要求は独自のコントローラインスタンスで動作します。スレッドの安全性は、ゲームに持ち込む場合にのみ重要です。 –

+0

@xxbbccこの場合、DbContextが複数のスレッド間で共有されていると思われる理由を説明してください。 –

+0

あなたは、DIコンテナの設定によってコントローラインスタンスの再利用を強制することができますが、どうしてあなたは困ってしまいますか? –

答えて

4

各コントローラは要求ごとに1回作成されますが、シングルトンではありません。インスタンスメンバーはスレッド間で共有されません。

UserControllerのアクションに対する新しいリクエストが新しいUserControllerになり、新しいMunicipalContextが作成されるたびに、答えはいいえです。コードにスレッドの問題はありません。

注意:MunicipalContextインスタンスが使用されなくなったときにDispose()に覚えておいてください。詳細情報here

+0

これが記載されているドキュメントへのリンクがありますか?私は、別のコントローラーはすべての要求に対して保証されていないが、おそらく私はそれについて間違っているという印象を受けていました。 – xxbbcc

+0

@xxbbcc ['DefaultControllerFactory'](https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultControllerFactory.cs)はリクエストごとに新しいコントローラを作成します。 [このドキュメント](https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/lifecycle-of-an-aspnet-mvc-5-application/_static/lifecycle-of-an -aspnet-mvc-5-application1.pdf)は、MVC 5要求のライフサイクルを簡単に示しています。 –

+0

ありがとうございます - 私は間違っていたと思います。 – xxbbcc

1

あなたが任意のスレッドの安全性の問題を持っていないが、一般的にあなたがコンテキストは、コンテキストあたりの要求パターン

を達成するためのIoCを使用してコントローラに注入されたASP.NET MVCとわずかに異なるパターンを使用します

あなたのコントローラがデータベースアクセスを行っているいくつかのサービスを消費する場合、問題が発生します。それらの間でコンテキストを共有しないと、奇妙な動作や不正な動作が発生する可能性があります。

IoCコンテナは、要求が処理された後にコンテキストで処理を実行できます。どのように実際にこれを行うかは、従来のASP.NET(HttpModule経由)またはOwin(ミドルウェアコンポーネント)を使用しているかどうかによって異なります。

関連する問題