2010-01-25 6 views
31

Je veux juste m'assurer que je ne suppose pas quelque chose d'idiot ici, lors de l'implémentation du modèle singleton dans une application Web ASP .Net, la portée de variable statique est seulement pour la session utilisateur actuelle, non? Si un deuxième utilisateur accède au site, la portée de la mémoire est-elle différente?ASP .NET Singleton

+6

La réponse courte est non, vous avez tort. –

+1

Dupliquer: http://stackoverflow.com/questions/194999/are-static-class-instances-unique-to-a-request-or-a-server-in-asp-net –

Répondre

28

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

+3

+1 "Seulement si vous avez une ferme avec différents serveurs vous auriez plus d'une instance de la variable ". –

4

Si vous avez besoin d'un utilisateur ou d'une session, 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/

+0

Votre lien semble être mort –

+2

@Michael Lang: Oui, il semble que sam a changé son moteur de contenu. Mise à jour du lien avec la nouvelle référence – NotMe

0

Le singleton est utilisé pour l'ensemble du domaine d'application, si vous voulez stocker les données relatives session utilisateur, utilisez Session HttpContext qui est conçue à cette fin. Bien sûr, vous devrez probablement revoir la structure de votre classe afin de trouver une façon de traiter les données avec lesquelles vous travaillez.

15

Comme d'autres l'ont mentionné, une variable statique est global to the entire application, not single requests.

Pour faire une demande mondiale singleton à seulement individuelles, vous pouvez utiliser le dictionnaire HttpContext.Current.Items.

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"]; 
     } 
    } 
} 
+0

Merci, Quel est le frais généraux de cela? cela sera-t-il beaucoup plus lent si j'accède au singleton assez souvent? – Wesly

+0

@Ws Vous ne devriez pas remarquer de problèmes de performance avec cette approche. L'implémentation du dictionnaire est très efficace, donc elle ne ralentira pas votre application, même si vous y accédez beaucoup. –

+0

pourquoi devrions-nous utiliser "HttpContext.Current.Items" au lieu de "Session"? – Seva

32

membres statiques ont une portée du processus de travail en cours seulement, donc il n'a rien à voir avec les utilisateurs, parce que d'autres demandes ne sont pas nécessairement traitées par le même processus de travail. Pour partager des données avec un utilisateur spécifique et entre requêtes, utilisez HttpContext.Current.Session.

  • Pour partager des données dans une requête spécifique, utilisez HttpContext.Current.Items.
  • Pour partager des données sur l'ensemble de l'application, écrivez un mécanisme à cet effet ou configurez IIS pour qu'il fonctionne avec un seul processus et écrive une application singleton/use. Par ailleurs, le nombre de processus de travail par défaut est 1, c'est pourquoi le web est plein de gens pensant que les membres statiques ont une portée de l'application entière.

  • -2

    Session pour l'application entière par utilisateur. ViewState pour une seule page asp.