Выборочное уведомление об изменении для нескольких клиентов (C#)

Мне нужно реализовать механизм уведомления для системы с одним менеджером и несколькими потребителями/клиентами. Менеджер должен опрашивать базу данных и запускать событие всякий раз, когда в данных происходят изменения. Теперь было бы легко, если бы все клиенты были заинтересованы в одних и тех же данных, и было бы достаточно реализовать одно событие и подписаться на это событие всех клиентов. Однако клиенты должны получать события только для тех данных, за которые они несут ответственность.

Например, есть несколько клиентов, которые добавляют новых клиентов. Это происходит через менеджер потокобезопасным способом. Теперь эти клиенты, которые создали клиентов, должны знать обо всех изменениях, которые происходят только с этими клиентами. Менеджер опрашивает таблицу Customers каждые N секунд и получает список всех клиентов, которые изменились. Затем менеджеру нужно будет «направить» (из-за отсутствия лучшего слова) уведомления заинтересованным клиентам.

Это должно быть реализовано с помощью какого-то обратного вызова, который каждый клиент должен будет предоставить менеджеру? Это похоже на то, что мне нужно, но я не знаю, как я могу передать параметры этому обратному вызову (здесь это клиенты, которые меня интересуют, не беспокойте меня, когда у вас есть обновления для любого другого клиента)

Я использую С#, .NET 2.0. Спасибо!


person kateroh    schedule 11.11.2010    source источник


Ответы (1)


Это хорошее описание шаблона Observer. Обычно клиент регистрирует у менеджера интерес к набору важных для него данных, предоставляя средства уведомления (это будет ваш обратный вызов). Клиент также может отменить регистрацию, если он больше не заинтересован в ранее полезных данных. Затем задача менеджера состоит в том, чтобы распространить изменения среди всех заинтересованных Observers (то есть клиентов).

В C# необходимая инфраструктура доступна в виде первоклассных функций языка — событий и делегатов. Хороший (хотя и простой) пример кода здесь.

В .Net 4 это удобство сделано еще дальше: ObservableCollection<T> доступен для автоматизировать процесс уведомления.

Кстати, я бы по возможности избегал опроса базы данных. Вы не можете получать уведомления о необходимых изменениях в вашей БД? В C#/SQL Server вы можете использовать SqlDependency. .

person Steve Townsend    schedule 11.11.2010
comment
События здесь не вариант, потому что подписчику нужно указать, для каких клиентов он хочет получать уведомления. ОП, вероятно, нужно что-то вроде void Subscribe(int customerId, CustomerChangedEventHandler handler). Вы не можете сделать это, используя события - person Thomas Levesque; 11.11.2010
comment
События - это вариант. Вы можете обойти обработчики событий (например, CustomerChangedEventHandler). Класс менеджера добавит обработчики в файл Dictionary<int, List<CustomerChangedEventHandler>>. Затем менеджер может обработать событие и на основе customerId вызвать список обработчиков событий, связанных с клиентом. Клиентский код не догадался бы, что он не обрабатывает события напрямую. Казалось бы, что они есть. - person Enigmativity; 11.11.2010
comment
Спасибо за указание на шаблон Observers. Читаю его сейчас и выясняю, как я могу реализовать его самостоятельно. Я на .NET 2.0, поэтому ObservableCollection не вариант. Что касается SqlDependency, уведомление об изменении было введено в SQL2005, но устарело в 2008 (2005 SP3). ServiceBroker не подходит из-за сложности и негибкости (например, переход с SQL на SQL Azure). - person kateroh; 11.11.2010