2008-11-09 16 views
3

Nous développons un système basé sur WCF. Dans le processus, nous essayons de verrouiller certaines données d'être modifiées par plus d'un utilisateur. Nous avons donc décidé d'avoir une structure de données qui contiendra les informations nécessaires à l'exécution de la logique de verrouillage (en stockant par exemple l'ID des objets verrouillés)Persistance des données WCF entre les sessions

Le problème que nous avons est de persister ces données entre les sessions. Y at-il de toute façon nous pouvons éviter d'exécuter des appels de base de données coûteux? Je ne suis pas sûr comment pouvons-nous faire cela dans WCF puisqu'il peut seulement persister des données (dans la mémoire) pendant une session ouverte.

Répondre

0

Peut-être un cadre de mise en cache comme velocity vous aider.

0

Créez une seconde classe et définissez InstanceContextMode sur single et déplacez toutes les méthodes coûteuses, puis dans votre classe d'origine utilisez ces méthodes.

4

Les membres statiques de la classe d'implémentation de service sont partagés entre les sessions & appels.

3

Une option serait d'utiliser des membres statiques comme l'a dit Jimmy McNulty. J'ai un service WCF qui ouvre des connexions réseau basées sur une adresse IP spécifiée par l'utilisateur. Mon service est configuré pour le mode d'instance de service PerCall. Dans chaque session, je vérifie une structure de données statique pour voir si une connexion réseau est déjà ouverte pour l'adresse IP spécifiée. Voici un exemple.

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    void Start(IPAddress address); 
} 

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
public class MyService : IMyService 
{ 
    private static readonly List<IPAddress> _addresses = new List<IPAddress>(); 
    public void Start(IPAddress address) 
    { 
     lock(((ICollection)_addresses).SyncRoot) 
     { 
      if (!_addresses.Contains(address) 
      { 
       // Open the connection here and then store the address. 
       _addresses.Add(address); 
      } 
     } 
    } 
} 

Comme configuré, chaque appel à Start() se passe dans sa propre instance de service, et chaque instance a accès à la collection statique. Comme chaque instance de service fonctionne dans un thread distinct, l'accès à la collection doit être synchronisé.

Comme pour toute synchronisation effectuée en programmation multithread, veillez à minimiser le temps passé dans le verrou. Dans l'exemple illustré, une fois que le premier appelant a saisi le verrou, tous les autres appelants doivent attendre que le verrou soit libéré. Cela fonctionne dans ma situation, mais peut ne pas fonctionner dans le vôtre.

Une autre option consisterait à utiliser le mode d'instance de service unique par opposition au mode d'instance de service PerCall.

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

De tout ce que j'ai lu, cependant, le PerCall semble plus flexible. Vous pouvez suivre cette link pour les différences entre les deux.

Et n'oubliez pas que la classe qui implémente votre service est juste une classe. Cela fonctionne comme toutes les classes C#. Vous pouvez ajouter un constructeur statique, des propriétés, des gestionnaires d'événements, implémenter des interfaces supplémentaires, etc.

Questions connexes