Как сохранить все подключения к сервису WCF? - PullRequest
2 голосов
/ 16 декабря 2010

Мой сервис 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.Но при выводе этот список используется всеми подклассами.

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

Ответы [ 2 ]

2 голосов
/ 16 декабря 2010

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

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

0 голосов
/ 16 декабря 2010

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

В вашем случае это может выглядеть так:

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

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

Связанные ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...