WCF实例管理

时间:2010-10-15 09:31:20

标签: c# silverlight wcf

我正在创建一个Silverlight纸牌游戏,它使用双面装订与WCF服务对话

每个客户通过发送他们的ID和他们想要玩的卡来与服务进行通信

作为回应,更新的游戏状态将传输到每个客户端

虽然我一直在测试,但我的实例设置如下

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

这意味着游戏状态保留在内存中。

现在,如果我想将其设置为广泛使用,(它不太可能非常受欢迎,但我们假设可以同时播放超过1个游戏),那么最合适的WCF实例化模式是什么? / p>

我目前正在考虑在每个玩家转向后将游戏状态序列化到文档数据库,然后在未来的客户端通信中将其重新提交

但我很想知道是否有办法在游戏状态下保持游戏状态,但对于多场比赛

e.g。如果有3个游戏同时发生,游戏A的客户可以连接到一个服务实例,游戏B的客户端是否连接到另一个实例?

或者是让每个客户端传递游戏ID并从数据库或其他数据存储中检索序列化游戏状态的唯一方法吗?

编辑:

我对Sharable服务特别感兴趣 - 请参阅此文章 http://msdn.microsoft.com/en-us/magazine/cc163590.aspx 但在我使用的WCF版本中,这似乎不可用。我只有Single,Persession和PerCall

2 个答案:

答案 0 :(得分:0)

InstanceContextMode(您可能知道)是PerSession,PerCall或Single。这些都不支持为服务的特定实现维护单个实例的方案。相反,它们指的是服务和客户端之间连接的性质。例如,PerSession将为每个新客户端会话创建新的服务实现实例。

我认为理想的解决方案是将已保存的游戏存储在以游戏类型为关键字的数据库中,但将持续游戏保存在单个实例中的内存中。

但是,如果您需要在客户端之间实现实例共享,那么there is some documention on this

答案 1 :(得分:0)

我们前一段时间有同样的要求,我们使用'内存状态管理'来做到这一点。创建游戏频道列表,以及用户的另一个列表以及游戏频道ID,这就是我们如何知道哪个用户订阅了哪个游戏频道。

用户可以玩多个游戏,但不能两次进入同一游戏,如果与客户端/服务器断开连接,可以根据客户端的请求再次连接。

还有很多其他的事情。我建议加载测试你实施的每个解决方案。

相关问题