Bonjour,
Je développe une application utilisant WCF, pour être plus précis une application de tchat. Dedans chaque utilisateur dispose d'un pseudo unique et il quand un utilisateur envois un message tous le monde le reçois. Cependant je voulais par exemple pouvoir en plus de pouvoir envoyer un message à tous le monde, permettre d'envoyer un message à une personne en particulier.
La liste des utilisateurs connecté est sauvegardé dans une collection static de mon service. Les objets dans cette collection est une classe User que j'ai crée. Ensuite j'avais configuré mon service de sorte qu'il y ai une instance par session utilisateur. Donc mon service dispose en private d'un attribut de type User (toujours ma classe) et à chaque fois qu'un utilisateur s'y connecte on garde ces informations le concernant pour l'instance qui lui a été crée.
J'ai crée différent évènements dans mon service auquel chaque instance va venir s'abonner. Par exemple quand un utilisateur se connecte l'évènement est déclenché et ce qui aura pour conséquence de lancer un appel à chaque client étant abonné pour les notifier d'un nouvel arrivant.
Tout ça pour en venir au fait que jusqu'à maintenant tous ce que je faisais concernait tous le monde. Un message est envoyé tous le monde le reçois par exemple. Donc pour pouvoir par exemple envoyer un message en privée il me faudrait trouver le destinataire concerné et appelé la méthode de réception des message que pour cette utilisateur.
Si j'écris ce post c'est que j'aurais besoin de votre avis sur la manière dont je comptais procéder. Sachant que j'ai ma liste d'utilisateur connecté en static et donc disponible pour n'importe quelle instance du service, je pensais tous simplement remplacer ma collection d'User (défini de cette manière List<User>) par une collection des instances du services. Car chaque instance de mon service dispose d'information sur l'utilisateur, il me suffirait alors juste de parcourir la collection et quand je tombe sur le type utilise juste son instance pour envoyer le message. Pensez-vous que cela puisse être une bonne idée?
Voila ce que donne mon service pour le moment:
En faite je me pose quelques questions quand à la mise en place de cette façon, car quand l'utilisateur va se connecter une instance du service va lui être crée donc stockée quelque part par le ServiceHost je suppose, mais je vais moi aussi le rajouter à ma collection static. Donc on aura deux instances du service. Je me pose des questions par exemple dans le cas des event, est-ce qu'elle risque donc de se déclencher deux fois? Est-si je détruit une des instances, est-ce que cela va détruire la connexion? Car quand l'utilisateur va vouloir se déconnecter je vais d'abord devoir retirer son instance de ma collection pour qu'il ne soit plus dans la liste des utilisateurs connectés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Single)] public class ServiceChat : IServiceChat { private static List<User> UserList; private User Utilisateur; //suite et fin de la classe }
Je suis désolé si je semble pas clairs. Si du code peut vous aider à mieux m'aider et me conseiller je me ferais un plaisir de vous le donner.
je vous remercie d'avance pour vos conseils.
Partager