Как решить состояние без состояния в клиент-серверном приложении? - PullRequest
0 голосов
/ 28 октября 2009

Я прочитал несколько книг по созданию сайтов без учета состояния, я прочитал некоторые о клиентских приложениях с состоянием, но возникает большая сложность, когда вам приходится комбинировать оба. У нас есть приложение Flex, которому необходимо сохранять данные в базе данных с помощью сервисов .NET. Что нужно иметь в виду: - Параллелизм (оптимистичный / пессимистичный) - Производительность: Flex должен загружать большое количество данных, поэтому часто требуется отложенная загрузка. - Используете ли вы Dto для передачи данных между сервером и клиентом?

Я расскажу вам историю нашего продукта. Мы использовали SubSonic с самого начала как o / r mapper. SubSonic объекты преобразуются в dto, написанные нами, и эти dto передаются клиенту. Клиенты со стороны dto преобразуются в модель предметной области. Если на стороне клиента необходимо сохранить объект модели домена, он преобразуется обратно в dto и отправляется на сервер. На стороне сервера dto преобразуется в дозвуковой объект и сохраняется в базе данных.

Теперь, некоторое время назад, нам была нужна модель домена на стороне сервера .NET ... так что теперь у нас есть три модели на стороне сервера: дозвуковая модель, модель dto и модель домена. Модель dto более проста и больше напоминает базу данных, модель предметной области имеет гораздо больше логики. Это становится сложным ... Теперь мы должны синхронизировать код модели домена AS3 с кодом модели домена C #. Если бы мы могли сделать это снова (чтобы получить время на рефакторинг), я думаю, что мы больше не будем использовать dto, а перенесем модель домена между клиентом и сервером. Вопрос в том, реалистично ли это. Это простые объекты, которые легко переносить. Объекты модели предметной области могут быть очень сложными.

Существуют ли книги о том, как создать архитектуру для таких приложений? Книги написаны кем-то с большим опытом? У вас есть опыт с этим?

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

Реальность такова, что совместное использование объектов между клиентом и сервером довольно сложно. Вот что вам нужно, чтобы это произошло:

Простой / не масштабируемый способ:

Унаследуйте всех ваших объектов от MarshalByrefObject. Если вы создадите Объект A на сервере и отправите его клиенту, любые клиентские модификации объекта будут автоматически отправлены на сервер.

Хотя это звучит как идеальное решение, у него есть две основные проблемы:

  1. Клиент и сервер тесно связаны с .NET (пока веб-сервисами)
  2. Это может быть кошмар спектакля. Все методы / свойства доступа будут перенаправлены на сервер. Если вы выберете этот маршрут, ваши объекты должны быть рассчитаны на громоздкие звонки, а не на разговоры.

Масштабируемый / сложный способ:

Вместо использования MarshalByRefObject вы будете использовать DataContract/Serializable объектов. Тем не менее:

  • Если вы создадите Объект A на сервере и отправите его клиенту, клиент получит копию объекта (назовем его Object B )
  • Когда вы отправляете Объект B обратно на сервер, сервер получит копия объекта B (назовем его объект C )

Но вы действительно хотите, чтобы сервер обрабатывал Объект A и Объект C как одно и то же. К сожалению, CLR не может этого сделать, поэтому вам понадобится Object Merger для работы как на клиенте, так и на сервере.

Object Merger будет содержать словарь всех объектов в модели и знать, как идентифицировать два экземпляра как одинаковые, и объединять любые значения с принимающей стороны. Например, если клиент уже имеет объект C в памяти и получает обновленную копию с сервера, он скопирует значения.

К сожалению, это также чревато проблемами, потому что вам нужно убедиться, что ссылки на объекты сохраняются правильно. Вы не можете просто вслепую обновлять все свойства объекта, поскольку у объекта могут быть существующие ссылки на другие объекты, что, в свою очередь, может потребовать их собственного слияния. Кроме того, вам также необходимо отслеживать добавленные / удаленные объекты, содержащиеся в списках или словарях.

Я добавил n-уровневую поддержку в свою собственную среду, поэтому сейчас выполняю то же упражнение (я выбираю «масштабируемый / сложный» маршрут). К счастью, у меня есть много вспомогательной инфраструктуры, помогающей с идентификацией, слиянием и т. Д. Если вы начинаете с нуля, это будет значительная часть работы.

P.S. Добавьте в микс прокси с отложенной загрузкой (я использую Nhibernate), и он становится еще больше интересным ...

0 голосов
/ 28 октября 2009

Иди и прочитай что-нибудь от Фаулера, в частности его шаблоны проектирования (особенно шаблон ассемблера и зачем вам нужно то, что вы уже делаете)

Шаблоны корпоративных приложений Фаулера

...