「シングルトン」は、「共有インスタンスが1つの通常の」オブジェクトとは異なり、「HttpContext.Currentのような単一のインスタンスとして表示されるオブジェクト」という珍しい意味で使用されています。この「シングルトン」はASP.NETアプリケーションでスレッドセーフであるべきですか?
私のasp.net MVCアプリケーションには、UserContext
クラスのシングルトンタイプを使用しています。このクラスを使用すると、強く型付けされたセッションオブジェクトとしてユーザーデータを格納できます。私はthis CodeReview questionを見つけ、このアプリケーションのコンテキストでスレッドの安全性を心配する必要があるかどうか疑問に思った。
は、ここに私のコードの簡素化です:
public class UserContext
{
private UserContext()
{
}
public static UserContext Current
{
get
{
if (HttpContext.Current.Session["UserContext"] == null)
BuildUserContext();
return (UserContext)HttpContext.Current.Session["UserContext"];
}
}
private static void BuildUserContext()
{
if (!user.Identity.IsAuthenticated) return;
var uc = new UserContext { IsAuthenticated = true };
// ...snip...
// Set up user data
// Save it into the session
HttpContext.Current.Session["UserContext"] = uc;
}
#region Class members
public bool IsAuthenticated { get; internal set; }
public string Name { get; internal set; }
// ...snip...
// Other properties
public void Refresh()
{
BuildUserContext();
}
public void Flush()
{
HttpContext.Current.Session["UserContext"] = null;
}
#endregion
}
私がこれまでの任意のロックの問題を持っていなかったが、今のサイトは非常に高いトラフィックではありません。私はJon Skeetのスレッドセーフなモデルを採用すべきですか、それともIISが私のために管理していますか?
サンプルに「シングルトン」はありますか?コードは合理的ですが、通常の意味ではオブジェクトは「シングルトン」ではありません(インスタンスが1つのオブジェクト - http://en.wikipedia.org/wiki/Singleton_pattern)...実際にシングルトンとして使用されると大きな問題になります。 –
ええ、実際にタイトルに「シングルトン」という単語を含める前に一時停止しましたが、それをより効率的に記述する方法はありませんでした。セッションの文脈の中ではシングルトンですが、そうです、それはアプリケーション全体のシングルトンではありません。私の質問は、スレッディングがどのように処理されるか、そしてこれが問題を引き起こすかどうかについてです。 –