هل يمكنني الوصول إلى الفاصوليا المغطاة بالجلسة الربيعية من الفاصوليا المغطاة بالتطبيق؟ كيف؟

StackOverflow https://stackoverflow.com/questions/2897299

سؤال

أحاول جعل تطبيق لعبة الويب المكون من لاعبين باستخدام Spring MVC. لدي حبوب سكرية Player والفاصوليا المغطاة بالتطبيق GameList, الذي يخلق ويخزن Game الحالات ويمرهم إلى Players. على اللاعب يخلق لعبة ويحصل على هويتها من GameList ويرسل لاعب آخر معرف إلى GameList ويحصل Game نموذج. ال Game على سبيل المثال لديه لاعبيها كسمات. المشكلة هي أن كل لاعب يرى نفسه فقط بدلاً من الآخر.

مثال على ما يراه كل لاعب:

  1. أول لاعب (أليس) يخلق لعبة: Creator: Alice, Joiner: Empty
  2. اللاعب الثاني (بوب) ينضم إلى اللعبة: Creator: Bob, Joiner: Bob
  3. أول لاعب ينعش متصفحها Creator: Alice, Joiner: Alice

ما أريدهم أن يراهم هو Creator: Alice, Joiner: Bob. تتمثل الطريقة السهلة لتحقيق ذلك في توفير المعلومات حول اللاعبين بدلاً من الإشارات إلى اللاعبين ، ولكن يحتاج كائن اللعبة إلى استدعاء أساليب الكائنات الخاصة به ، لذلك ليس هذا حلًا.

أعتقد أنه بسبب aop:scoped-proxy من اللاعب الفاصوليا إذا فهمت هذا ، فإن كائن اللعبة لديه إشارة إلى الوكيل ، والذي يشير إلى كائن اللاعب في الجلسة الحالية. هل يمكن لمثيل اللعبة حفظ/الوصول إلى كائنات اللاعب الأخرى بطريقة ما؟

الفاصوليا في المرسل servlet.xml:

<bean id="userDao" class="authorization.UserDaoFakeImpl"  />
<bean id="gameList" class="model.GameList" />
<bean name="/init/*" class="controller.InitController" >
     <property name="gameList" ref="gameList" />
     <property name="game" ref="game" />
     <property name="player" ref="player" />
</bean>
<bean id="game" class="model.GameContainer" scope="session">
      <aop:scoped-proxy/>
</bean>
<bean id="player" class="beans.Player" scope="session">
      <aop:scoped-proxy/>
</bean>

الأساليب في Controller.InitController

private GameList gameList;
private GameContainer game;
private Player player;
public ModelAndView create(HttpServletRequest request,
        HttpServletResponse response) throws Exception {        
    game.setGame(gameList.create(player));        
    return new ModelAndView("redirect:game");
}
public ModelAndView join(HttpServletRequest request,
        HttpServletResponse response, GameId gameId) throws Exception {
    game.setGame(gameList.join(player, gameId.getId()));       
    return new ModelAndView("redirect:game");
}

تسمى الأساليب في نموذج

public Game create(Player creator) {        
    Integer code = generateCode();        
    Game game = new Game(creator, code);
    games.put(code, game);
    return game;
}
public Game join(Player joiner, Integer code) {
    Game game = games.get(code);
    if (game!=null) {
        game.setJoiner(joiner);           
    }
    return game;
}
هل كانت مفيدة؟

المحلول

أعتقد أنك محق في أن تكون الوكيل لماذا ترى نفسك فقط. سيتم تطبيق أي إشارة إلى الوكيل على الكائن في جلستك فقط.

هل تحتاج إلى أن يكون لديك اللعبة واللاعب كجلسة مخططة؟ تشير حقيقة أنك تحاول استخدامها عبر الجلسات إلى أنها ليست بيانات تحديد الجلسة. يمكنك فقط إنشائها من مصنع وتخزين مراجعها في حبة محددة في الجلسة.

بدلاً من ذلك ، إذا كنت تريد أن يكون اللاعب محطماً للجلسة ، فيمكنك لف إشارة إلى نموذج أولي في حبة جلسة. يمكنك بعد ذلك استخدام مرجع النموذج الأولي لبيانات الجلسة المتقاطعة ، وفول الجلسة لأي بيانات محلية محددة للجلسة.

هناك عدة طرق لحل ذلك ، ولكن في جوهرها تحتاج إلى نقل بيانات الجلسة المتقاطعة من الفاصوليا المنتشر في الجلسة وفي حبة نطاق التطبيق التي يمكن مشاركتها.

نصائح أخرى

لا يمكنك الوصول إلى الفاصوليا المختلفة التي يتم إدراجها من الجلسة من وحيد التطبيق.

ومع ذلك ، يمكنك القيام بعكس ذلك - تسجيل كل لاعب في الفاصوليا المغطاة بالتطبيق ، (عن طريق الاتصال addPlayer(..))

لا يمكنك الحصول على بيانات اللعبة في جلسة HTTP ، لأن ذلك ينتمي إلى مستخدم واحد فقط.

تحتاج إلى تخزين إشارة إلى اللعبة في كل من جلسة المبدعين والنجارة.

نعم ، وأسهل طريقة هي إنشاء الوكيل مع التعليق التوضيحي التالي:

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)

متاح من الربيع 3.1. في الأوقات القديمة ، كان عليك استخدام علامة AOP: Tag-proxy في تكوين XML

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top