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.