2010-11-16 19 views
1

Comment puis-je lier une dépendance particulière à une page et la faire injecter pour les composants de cette page?Comment puis-je lier une dépendance injectée par ressort à une page de portillon?

J'ai mis en place un environnement dans mon application de portillon, en utilisant les (très petites) bibliothèques wicket-ioc et wicket-spring, où je peux appeler InjectorHolder.getInjector(). Inject (component), afin d'injecter le composant avec dépendances. Tous mes composants de guichet sont injectés par Spring via un IComponentInstantiationListener, et cette partie fonctionne (je l'utilise pour l'accès hibernate).

J'ai un objet sérialisable (ComponentGraph) que je veux stocker comme un champ sur la page. Comment est-ce que je peux faire ressortir à Spring sur quelle page le composant est sur, et injecter le bon ComponentGraph pour cette page quand un champ de ComponentGraph avec @SpringBean est déclaré?

Si quelqu'un pouvait me diriger dans la bonne direction, je l'apprécierais. J'ai une bonne compréhension de Wicket, mais Spring est encore un labyrinthe de concepts inconnus pour moi, à ce stade. =)

Répondre

1

Cela ne ressemble pas à un travail pour le printemps.

Cependant, je ne connais pas la portée de votre ComponentGraph, donc je dois faire quelques suppositions.

a) S'il y en a un par utilisateur, stockez-le dans un custom session object.

b) S'il y en a un par instance de page, créez une classe de pages de base à partir de laquelle toutes ces pages héritent. Laissez-le avoir un champ componentGraph avec un getter et un setter.

c) S'il y a une par classe de page, garder une carte de type <Class, ComponentGraph> dans un haricot d'aide (accessible par quelque chose comme helper.getComponentGraphForPageType(this.getClass()). Cela pourrait (et devrait) être injecté par ressort

+0

C'est par instance de page. Je pensais que le travail du CIO de printemps consistait à définir un «contexte» ou une portée (comme une session, une demande ou une page) et les services dans ce contexte peuvent être saisis à la demande (de sorte que, peut-être, je n'ai pas savoir quelle classe la page ou même en faire un champ sur la page afin d'avoir un graphe de composant)? – RMorrisey

+0

C'est le travail de Spring MVC, le framework web de Spring. Wicket définit ses propres mécanismes (plus simples). Vous pouvez * probablement * obtenir Spring pour activer la portée de la requête avec wicket, mais cela n'a pas vraiment de sens. Utilisez LoadableDetachableModels dans wicket si vous souhaitez une étendue de requête. –

0

printemps a le soutien de la demande et les champs de session, mais ne sait pas quelle est la portée de la page Wicket est pas de soucis, mais si vous injectez une usine de graphique dans la page, vous pouvez faire quelque chose comme ceci:..

public class Page extends WebPage { 
    @SpringBean private GraphFactory factory; 
    private ObjectGraph graph = null; 

    public Page() { 
     ... 
    } 

    protected ObjectGraph getGraph() { 
     if (graph == null) graph = factory.createGraph(); 
     return graph; 
    } 
} 

Après le graphique a été créé , il sera sérialisé avec votre page comme prévu