Нужно ли клиенту знать все о состоянии сервера?Я предполагаю, что некоторые вещи, происходящие на сервере, не важны и не нуждаются в мониторинге или являются слишком подробными для полного мониторинга.Поэтому клиент будет рассматривать сводную информацию о состоянии сервера, а не полную информацию обо всем.
Реплицированная модель djna - отличная идея - отдельный набор классов моделей на сервере, представляющий состояние, котороенужно поделиться с клиентом.Это будет упрощенная сводка полного внутреннего состояния сервера.
Мне интересно, сколько различных частей кода на сервере вносит изменения, о которых клиент должен знать - изменения в общей модели.Если изменения происходят из разных мест, не могли бы вы поместить упрощенный фасад поверх модели, чтобы контролировать доступ к нему?Поэтому, если все компоненты A, B, C и D необходимо внести изменения, все они должны пройти через фасад.Затем вы можете разместить логику отслеживания событий на фасаде, а не на всей модели.
Если вам нужно отслеживать много разных классов, вы можете использовать аспектно-ориентированное программирование для автоматизации добавления кода отслеживания в каждый класс. PostSharp - хороший инструмент, который может сделать это, добавляя код в ваши сборки .NET при компиляции приложения.
Это сообщение в блоге об использовании PostSharp для автоматизации отслеживания изменений с использованием интерфейса INotifyPropertyChanged.Похоже, для этого есть также плагин PostSharp с именем PropFu .
Поскольку вы управляете кодом на обоих концах (вызывая и обрабатывая события), вам не нужно использовать INotifyPropertyChangedВы можете определить свой собственный интерфейс, который лучше для вашего приложения.Но вы могли бы использовать аналогичный подход.
Код отслеживания изменений может поместить события в очередь в памяти на сервере.Клиент может периодически запрашивать у сервера последние события;сервер затем проверит эту очередь и отправит все события в очереди клиенту.(Вы также можете отправить каждое событие клиенту в режиме реального времени, но это, вероятно, не практично, если они происходят очень быстро.)
Когда клиент подключается, сервер может отправить снимок клиенту как djnaописано.С этого момента сервер может отслеживать события в своей очереди.Когда клиент отключается, сервер может остановить отслеживание событий, пока клиент не подключится позже.Когда клиент повторно подключается, сервер отправляет еще один полный снимок, за которым следуют другие события.
Я предполагал, что существует только один экземпляр клиента.Если их несколько, вам нужно отдельно отслеживать, какие события были отправлены каждому клиенту, и вам нужно отслеживать события, пока подключен хотя бы один клиент.