Реальность такова, что совместное использование объектов между клиентом и сервером довольно сложно. Вот что вам нужно, чтобы это произошло:
Простой / не масштабируемый способ:
Унаследуйте всех ваших объектов от MarshalByrefObject
. Если вы создадите Объект A на сервере и отправите его клиенту, любые клиентские модификации объекта будут автоматически отправлены на сервер.
Хотя это звучит как идеальное решение, у него есть две основные проблемы:
- Клиент и сервер тесно связаны с .NET (пока веб-сервисами)
- Это может быть кошмар спектакля. Все методы / свойства доступа будут перенаправлены на сервер. Если вы выберете этот маршрут, ваши объекты должны быть рассчитаны на громоздкие звонки, а не на разговоры.
Масштабируемый / сложный способ:
Вместо использования MarshalByRefObject
вы будете использовать DataContract/Serializable
объектов. Тем не менее:
- Если вы создадите Объект A на сервере и отправите его клиенту,
клиент получит копию объекта (назовем его Object B )
- Когда вы отправляете Объект B обратно на сервер, сервер получит
копия объекта B (назовем его объект C )
Но вы действительно хотите, чтобы сервер обрабатывал Объект A и Объект C как одно и то же. К сожалению, CLR не может этого сделать, поэтому вам понадобится Object Merger для работы как на клиенте, так и на сервере.
Object Merger будет содержать словарь всех объектов в модели и знать, как идентифицировать два экземпляра как одинаковые, и объединять любые значения с принимающей стороны. Например, если клиент уже имеет объект C в памяти и получает обновленную копию с сервера, он скопирует значения.
К сожалению, это также чревато проблемами, потому что вам нужно убедиться, что ссылки на объекты сохраняются правильно. Вы не можете просто вслепую обновлять все свойства объекта, поскольку у объекта могут быть существующие ссылки на другие объекты, что, в свою очередь, может потребовать их собственного слияния. Кроме того, вам также необходимо отслеживать добавленные / удаленные объекты, содержащиеся в списках или словарях.
Я добавил n-уровневую поддержку в свою собственную среду, поэтому сейчас выполняю то же упражнение (я выбираю «масштабируемый / сложный» маршрут). К счастью, у меня есть много вспомогательной инфраструктуры, помогающей с идентификацией, слиянием и т. Д. Если вы начинаете с нуля, это будет значительная часть работы.
P.S. Добавьте в микс прокси с отложенной загрузкой (я использую Nhibernate), и он становится еще больше интересным ...