2010-12-16 2 views
2

В моем сервисе WCF используются обратные вызовы. Чтобы позвонить всем клиентам, я использую что-то вроде этого:Как сохранить все подключения к службе WCF?

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)] 
class Svc 
{ 
    // stores all connections 
    private static List<Svc> Connections = new List<Svc>(); 

    // callback for this instance 
    private ICallback Cb; 

    public Svc() 
    { 
     Cb = OperationContext.Current.GetCallbackChannel<ICallback>(); 
     Connections.Add (this); 
    } 

    // ... lots of other code that uses or updates the list of connections 
} 

Это правильный способ сделать это?

Я спрашиваю, потому что я борюсь с очевидной проблемой дизайна в вышеупомянутом подходе. Я попытался переместить много общего кода, включая static List<Svc>, в общий базовый класс, который может использоваться всеми моими WCF-сервисами. Но при выводе этот список используется для всех подклассов.

Я попытался избежать этого нежелательного совместного использования, создав базовый класс generic (Svc<T>, что означает, что каждый подкласс получает свои собственные статические элементы), но это приводит к другим неприятностям и не является чистым дизайном.

ответ

2

Да, это правильный подход к хранению ссылок на ваши клиенты для отправки обратных вызовов всем им. Я не храню объекты CallbackChannel, но экземпляры OperationContext в моей службе.

К вашему другому вопросу: вы можете извлечь код для администрирования списка подключенных клиентов в отдельный класс и использовать экземпляр этого класса в своей службе.

0

Используйте шаблон Singleton, когда вам нужно хранить глобальное состояние централизованным образом.

В вашем случае это может выглядеть следующим образом:

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

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

Близкие по теме ресурсы:

+0

К сожалению, я не понимаю, как это помогает в любом путь? Проблема с общими переменными не решена. И сервис не может быть singleton для начала (`PerSession`). – mafu 2010-12-16 13:15:01

Смежные вопросы