【发布时间】:2011-11-01 03:07:32
【问题描述】:
我面临的问题的一个(简化)版本如下,在 Spring MVC 应用程序中:
两个玩家可以在一场比赛中竞争。这个游戏包括从相同的数据(例如某个棋子位置)开始,分开玩游戏(但同时!),然后比较结果。为了管理这个,我有:
- 处理游戏的对象(例如,检查玩家是否准备就绪、生成开始数据、检查游戏是否结束……)。为了便于参考,我们将其称为“GameHandler”。
-
对于每个玩家,处理游戏动作(例如在棋盘上移动棋子)的对象。这是一个会话范围的 bean,因为它包含特定于玩家的状态信息。将其称为“PlayerHandler”:
问题在于 GameHandler 需要对两个 PlayerHandler 的引用。但是,由于这是一个代理会话范围的 bean,因此这些引用指向同一个 bean,具体取决于我用来访问它的会话。例如。两名球员,“汤姆”和“杰瑞”:
会话 Tom:playerHandler.getGameHandler().getPlayer1().getName() 和 playerHandler.getGameHandler().getPlayer2().getName() 都是 Tom
Session Jerry:两人都是Jerry。
现在,据我了解,这是预期的行为。我的问题是不是“为什么会这样”,而是“我该如何解决这个问题”。我发现自己的一个解决方案是在 GameHandler 中设置引用时引用实际的 bean,而不是代理:
public void setPlayerOne(PlayerHandler playerHandler) {
try {
while (playerHandler instanceof Advised)
playerHandler = (PlayerHandler ) ((Advised) playerHandler ).getTargetSource().getTarget();
} catch (Exception e) {
e.printStackTrace();
}
...
但是,我不确定这是最好的解决方案。所以我正在寻找一些答案:我的设计错了吗?如果错了,你会如何设计这个?我错过了一个简单的解决方案吗?这是 Spring 的限制吗?
【问题讨论】:
-
一次只能进行一场比赛,还是可以让多对玩家玩不同的比赛?
-
@bkent314 多对必须是可能的。
标签: java spring session spring-mvc