Должен ли этот «синглтон» быть поточно-ориентированным в приложении ASP.NET? - PullRequest
3 голосов
/ 10 января 2012

Обратите внимание, что «singleton» используется в немного необычном смысле - «объект, видимый как отдельный экземпляр, такой как HttpContext.Current», в отличие от обычного «объекта с одним общим экземпляром».1003 * класс для моих приложений asp.net MVC.Этот класс позволяет мне хранить пользовательские данные как строго типизированный объект сеанса.Я наткнулся на этот вопрос CodeReview и подумал, нужно ли беспокоиться о безопасности потоков в контексте этого приложения.

Вот упрощение моего кода:

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
}

У меня пока не было проблем с блокировкой, но сейчас на сайте не очень высокий трафик.Должен ли я принять поточно-ориентированную модель Джона Скита или IIS справляется с этим для меня?

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Доступ к Session уже потокобезопасен.

В общем, если вы обращаетесь к любому общему состоянию в ваших статических свойствах потокобезопасным способом, у вас не возникнет никаких проблем.

1 голос
/ 10 января 2012

Состояние сеанса ASP поставляется с синхронизирующей логикой. Если исполняемой странице требуется доступ на запись к состоянию сеанса, состояние сеанса блокируется, и другой запрос в том же сеансе должен ждать, пока не завершится первый.

См. Синхронизация доступа к состоянию сеанса .

...