Обратите внимание, что «singleton» используется в немного необычном смысле - «объект, видимый как один экземпляр, такой как HttpContext.Current« в отличие от обычного »объекта с одним общим экземпляром».Должен ли этот «singleton» быть потокобезопасным в приложении ASP.NET?
Я использую одноэлементный тип класса UserContext
для приложений asp.net MVC. Этот класс позволяет хранить пользовательские данные в виде строго типизированного объекта сеанса. Я столкнулся с 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 справится с этим для меня?
Где находится "singleton" в вашем примере? Код является разумным, но объект не является «одноэлементным» в любом обычном смысле (объект с одним экземпляром - http://en.wikipedia.org/wiki/Singleton_pattern) ... Было бы огромной проблемой, если бы фактически использовалось как singleton. –
Да, я на самом деле остановился, прежде чем включать слово «singleton» в названии, но у меня не было более эффективного способа его описания. В контексте сеанса это синглтон, но вы правы, это не одноэлементная область приложения. Мой вопрос о том, как обрабатывать потоки и может ли это возникнуть проблема. –