Управление экземплярами WCF - PullRequest
2 голосов
/ 15 октября 2010

Я создаю карточную игру silverlight, которая взаимодействует со службой WCF с использованием дуплексной привязки

Каждый клиент связывается со службой, когда наступает его очередь, отправляя свое удостоверение личности и карты, которые он хочет разыграть

И в ответ обновленное состояние игры передается каждому клиенту

Пока я тестировал, я настроил инстансинг следующим образом

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]

Это означает, что состояние игры сохраняется в памяти.

Теперь, если я хочу настроить это для широкого использования (вряд ли это будет очень популярно, но давайте предположим, что в одно и то же время можно играть более чем в одну игру), какой будет наиболее подходящий режим Instancing WCF?

В настоящее время я думаю, что сериализация состояния игры с базой данных документов после каждого хода игрока, а затем повторное получение его по будущим коммуникациям клиента

Но мне любопытно узнать, есть ли способ сохранить состояние игры в памяти, но для нескольких игр

например. если одновременно происходит три игры, могут ли клиенты для игры A все подключаться к одному экземпляру службы, а клиенты для игры B - к другому экземпляру?

Или единственный способ заставить каждого клиента передать идентификатор игры и получить сериализованное состояние игры из БД или другого хранилища данных?

EDIT:

Меня особенно интересуют службы Sharable - см. Эту статью http://msdn.microsoft.com/en-us/magazine/cc163590.aspx Но это, кажется, не доступно в версии WCF, которую я использую. У меня есть только Single, Persession и PerCall

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

Некоторое время назад у нас было такое же требование, и мы сделали это, используя «управление состоянием в памяти». Создание списка игровых каналов и другого списка для пользователей вместе с идентификатором игрового канала, так что, как мы знаем,какой пользователь подписан на какой игровой канал.

пользователь может играть в несколько игр, но не может войти в одну и ту же игру дважды, в случае каких-либо отключений от клиента / сервера он может быть снова подключен по запросуклиент.

Также есть много других вещей. Я бы рекомендовал загрузить тестирование каждого решения, которое вы реализуете.

0 голосов
/ 15 октября 2010

InstanceContextMode (как вы, вероятно, знаете) - это PerSession, PerCall или Single.Ни один из них не поддерживает сценарий обслуживания одного экземпляра для конкретной реализации службы.Вместо этого они относятся к природе соединения между службой и клиентом.Например, PerSession будет создавать новый экземпляр вашей реализации сервиса для каждого нового клиентского сеанса.

Идеальное решение, которое я думаю, - хранить сохраненные игры в базе данных с ключом по типу игры, но хранить текущие игры в памяти в пределахsingleon instance.

Однако, если вам do необходимо реализовать что-то по принципу совместного использования экземпляров между клиентами, тогда есть некоторая документация по этому .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...