web-dev-qa-db-fra.com

ASP .net singleton

Je veux juste m'assurer que je ne suppose pas quelque chose de stupide ici, lors de la mise en œuvre du motif singleton dans une application Web ASP .NET, la portée de la variable statique n'est que pour la session d'utilisateur actuelle, non? Si un deuxième utilisateur accède au site, il s'agit d'une option de mémoire différente ...?

37
Wesly

La portée de la variable statique est destinée à l'ensemble du domaine de l'application, ce qui signifie que d'autres sessions y ont également accès. Ce n'est que si vous avez une ferme avec différents serveurs, vous auriez plus d'une instance de la variable.

34
Otávio Décio

Les membres statiques ont une portée du processus de travail actuel uniquement, il n'a donc rien à voir avec les utilisateurs, car d'autres demandes ne sont pas nécessairement traitées par le même processus de travail.

  • Afin de partager des données avec un utilisateur spécifique et des demandes, utilisez httpcontext.Current.Session.
  • Pour partager des données dans une demande spécifique, utilisez httpcontext.current.items.
  • Pour partager des données sur l'ensemble de l'application, écrivez un mécanisme pour cela, soit configurer IIS pour utiliser un seul processus et écrire une application singleton/utilisation.

Au fait, le nombre de processus de travail par défaut est de 1, c'est pourquoi le Web est plein de personnes qui pensent que les membres statiques ont une portée de l'application complète.

35

Comme d'autres l'ont mentionné, une variable statique est global à l'application complète, pas des demandes simples.

Pour faire un singleton global pour seulement des demandes individuelles, vous pouvez utiliser le HttpContext.Current.Items dictionnaire.

public class Singleton
{
    private Singleton() { }

    public static Singleton Instance 
    {   
        get
        {
            if (HttpContext.Current.Items["yourKey"] == null)
                HttpContext.Current.Items["yourKey"] = new Singleton();
            return (Singleton)HttpContext.Current.Items["yourKey"];
        }
    }
}
15
Dan Herbert

Si vous en avez besoin pour être utilisateur ou session basé, consultez le lien suivant. Sinon, comme l'a dit Otavio, le singleton est disponible pour l'ensemble du domaine.

http://samcogan.com/singleton-per-asp-net-session/

4
NotMe

Le singleton est utilisé pour l'ensemble du domaine de l'application, si vous souhaitez stocker des données associées à la session utilisateur, utilisez la session httpcontext conçue à cette fin. Bien sûr, vous devez probablement redéfinir votre structure de classe pour pouvoir proposer un moyen de faire face à une paire de paires de clés de traiter avec les données que vous essayez de travailler.

0
Tomas Vana