2010-12-16 9 views
2

Mein WCF-Dienst verwendet Rückrufe. Um in der Lage zu sein, alle Clients aufzurufen, verwende ich etwas wie folgt:Wie alle Verbindungen zu einem WCF-Dienst gespeichert werden?

Ist dies der richtige Weg, es zu tun?

Ich frage, weil ich mit einem scheinbaren Design-Problem in der oben genannten Ansatz kämpfe. Ich habe versucht, eine Menge allgemeinen Code, einschließlich der static List<Svc>, in eine gemeinsame Basisklasse zu verschieben, die von allen meinen WCF-Diensten verwendet werden kann. Beim Ableiten wird diese Liste jedoch von allen Unterklassen geteilt.

Ich versuchte dann, diese unerwünschte Freigabe zu vermeiden, indem ich die Basisklasse generisch machte (Svc<T>, was bedeutet, dass jede Unterklasse ihre eigenen statischen Mitglieder erhält), aber dies führt zu anderen Belästigungen und ist kein sauberes Design.

Antwort

2

Ja, dies ist der richtige Ansatz zum Speichern von Verweisen auf Ihre Clients, um Rückrufe an alle zu senden. Ich speichere nicht die CallbackChannel-Objekte, sondern die OperationContext-Instanzen in meinem Dienst.

Zu Ihrer anderen Frage: Sie könnten den Code extrahieren, um die Liste der verbundenen Clients zu einer separaten Klasse zu verwalten und eine Instanz dieser Klasse in Ihrem Dienst verwenden.

0

Verwenden Sie das Singleton-Muster, wenn Sie den globalen Status zentral speichern müssen.

In Ihrem Fall könnte es so aussehen:

public Svc() 
{ 
    this.CallbackChannel = OperationContext.Current.GetCallbackChannel<ICallback>(); 

    // The static 'Instance' property returns the singleton 
    SvcActiveInstanceContainer.Instance.Add(this); 
} 

Verwandte Ressourcen:

+0

Sorry, ich verstehe nicht, wie dies in jedem hilft Weg? Das Problem mit freigegebenen Variablen ist nicht gelöst. Und der Dienst kann nicht mit Singleton beginnen ("PerSession"). – mafu

Verwandte Themen