Выборочное уведомление об изменении для нескольких клиентов (C#)
Мне нужно реализовать механизм уведомлений для системы, в которой есть один менеджер и несколько потребителей / клиентов. Менеджер должен опросить базу данных и инициировать событие всякий раз, когда в данных происходят изменения. Теперь было бы легко, если бы все клиенты были заинтересованы в одних и тех же данных, и этого было бы достаточно, чтобы реализовать одно событие и подписать всех клиентов на это событие. Однако клиенты должны получать события только для тех данных, за которые они отвечают.
Например, есть несколько клиентов, которые добавляют новых клиентов. Это происходит через менеджер потокобезопасным способом. Теперь эти клиенты, которые создали клиентов, должны знать о любых изменениях, которые происходят только с этими клиентами. Менеджер опрашивает таблицу "Клиенты" каждые N секунд и получает список всех клиентов, которые изменились. Затем менеджеру нужно будет "направить" (из-за отсутствия лучшего слова) уведомления заинтересованным клиентам.
Должно ли это быть реализовано с помощью своего рода обратного вызова, который каждый клиент должен будет предоставить менеджеру? Это звучит как то, что мне нужно, но я не знаю, как я могу передать параметры этому обратному вызову (здесь это клиенты, которые мне интересны, не беспокойте меня, когда у вас есть обновления для любого другого клиента)
Я использую C#, .NET 2.0. Спасибо!
1 ответ
Это хорошее описание паттерна Observer. Как правило, клиент регистрирует интерес у менеджера для набора данных, которые имеют к нему отношение, предоставляя средства уведомления (это будет ваш обратный вызов). Клиент также может отменить регистрацию, если он больше не интересуется ранее полезными данными. Тогда задача менеджера - распространять изменения на всех заинтересованных. Observers
(т.е. клиенты).
В C# необходимая инфраструктура доступна в виде первоклассных языковых функций - событий и делегатов. Здесь хороший (если простой) пример кода.
В.Net 4 это удобство сделало шаг вперед ObservableCollection<T>
доступно для автоматизации процесса уведомления.
Кстати - я бы избегал опроса базы данных, если это возможно. Нет ли способа получить уведомление о необходимых изменениях в вашей БД? В C#/SQL Server вы можете использовать SqlDependency.