2011-02-13 2 views
8

J'ai quelques services WCF. Ces services s'exécutent dans ASP.NET. Je veux que ces services puissent accéder à une variable statique. Mon problème est, je ne suis pas sûr où le mécanisme de stockage au niveau du serveur approprié est. Je ne veux pas utiliser la base de données à cause de la vitesse. Mais, je veux que les variables statiques restent en mémoire le plus longtemps possible. En fait, j'aimerais qu'il reste jusqu'à ce que je redémarre mon serveur si tout est possible.Variables statiques dans WCF

Quelqu'un peut-il me donner des idées?

Répondre

14

Vous pouvez utiliser des variables statiques dans WCF, mais vous devez synchroniser correctement l'accès à ces variables, car elles peuvent être accessibles simultanément à partir de plusieurs threads. Les valeurs stockées dans les variables statiques sont accessibles de partout dans l'AppDomain et restent en mémoire jusqu'à ce que le serveur soit redémarré.

+0

Mais comment les stocker dans l'AppDomain? – user609886

+1

Vous créez une variable statique dans une classe et vous y accédez à partir de votre service. –

4

Vous pourriez avoir quelque chose comme ça

public static class StaticVariables 
{ 
    private static string _variable1Key = "variable1"; 

    public static Object Variable1 
    { 
     get 
     { 
      return Application[_variable1Key]; 
     } 

     set 
     { 
      Application[_variable1Key] = value; 
     } 
    } 
} 

La collection Application lui-même est thread-safe, mais les choses que vous ajoutez à cela pourrait ne pas être; Alors garde cela en tête.

+0

Comment accéder à la variable "Application"? Je ne le vois pas dans Intellisense. – user609886

+0

Ce lien devrait être utile http://msdn.microsoft.com/en-us/library/94xkskdf(v=VS.85).aspx –

+1

Je serais ravi de voir des espaces de noms inclus quand on parle d'objets .NET comme Application parce qu'il y a plusieurs espaces de noms et pour certaines personnes cela devient confus. – tatmanblue

0

Si tous les services sont en un seul ServiceContract et si toutes les variables membres de votre service peuvent être partagées entre toutes les sessions, vous pouvez fixer le ServiceBehavior d'avoir un single instance.

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class MyService : IMyServiceContract 
{ 
}