如何在wicket中使用依赖注入?

时间:2010-09-16 07:38:15

标签: dependency-injection ioc-container wicket

如何将以下示例转换为使用其中一个wicket / IOC集成包?

我想学习并理解DI / IOC模式。我已经阅读了很多关于它的内容,但是如果不深入研究代码示例,我发现它有点难以掌握。我有一个完整的,工作的Wicket面板的例子,我想我想转换为使用DI。

该面板基本上是列表的Web UI编辑器。它需要一个IPanelFactory作为构造函数参数。构造函数创建一个列表(DefaultRefreshingView),面板工厂知道如何为每一行创建一个ViewPanel。 panelFactory还知道如何创建添加表单,以便将新项目引入列表。

我会删除大量代码,以了解我认为相关的内容:

public interface IPanelFactory<T extends DomainEntity, U extends DomainEntity>
        extends IDetachable {
    IAddItemPanel<T, U> newAddItemPanel(String id);

    Component newEditPanel(ViewPanel.ViewPanelParameters<T> parms);

    Component newListPanel(String id, IModel<Collection<T>> listModel);
}

public class ListEditorPanel2<T extends DomainEntity, U extends DomainEntity>
        extends Panel implements IHeaderContributor {
    private static final long serialVersionUID = 1L;

    private final IPanelFactory<T, U> panelFactory;

    public ListEditorPanel2(String id, IModel<Collection<T>> listModel,
            final IPanelFactory<T, U> panelFactory) {
        super(id, listModel);
        this.panelFactory = panelFactory;

        final AjaxCell listCell = new AjaxCell("listCell");
        DefaultRefreshingView<T> itemList = new DefaultRefreshingView<T>(
                "itemList", listModel) {
            @Override
            protected void populateItem(final Item<T> item) {
                Component editPanel = ListEditorPanel2.this.panelFactory
                        .newEditPanel(new ViewPanelParameters<T>("viewPanel",
                                item.getModel(), new EditPanelCallback(item)));
                item.add(editPanel);
            }
        };
        listCell.add(itemList);
        add(listCell);

        final IAddItemPanel<T, U> addItemPanel = panelFactory
                .newAddItemPanel("addItemForm");
        add((Component) addItemPanel);
        Form<T> form = addItemPanel.getForm();
    }
}

IPanelFactory的每个实现都为View和Add部分提供了不同的组件。可能有多个ListEditorPanel2实例在同一页面层次结构中使用不同的工厂实现。

我的想法是我希望IPanelFactory成为一个注入依赖项。所以......

  • 这是DI / IOC的一个很好的用例,还是在这里使用它没有意义?
  • 如果不使用IOC容器,我将如何“手动”执行此操作? (我已经这样做了吗?)
  • 我应该使用哪种wicket-IOC集成?我目前正在使用wicket 1.4.8。我打算尝试wicket-spring-annot,但看起来这个项目已经过时了。
  • 如何为我的wicket组件设置IOC容器?

1 个答案:

答案 0 :(得分:1)

我不太明白你的用例,但无论如何我会尽力回答你的问题。 Wicket对2种最受欢迎​​的DI容器即Spring和Guice有很大的支持。我个人更喜欢使用guice,因为它发现它不那么臃肿,更容易使用。您需要了解guice的工作原理以及如何创建guice模块。要使用guice集成wicket应用程序,您可以在wicket应用程序init方法上执行以下操作:

Injector injector = Guice.createInjector(new   AppModule(),PersistenceService.usingJpa().across(UnitOfWork.REQUEST).buildModule());
addComponentInstantiationListener(new GuiceComponentInjector(this, injector));

这里实例化一个带有2个模块的guice注入器,即appModule和Persistence模块(忽略persistenceModule的详细信息。我使用warp persist进行事务处理)

在guice模块中,绑定要注入的所有组件。我主要绑定我的Daos和我的服务。然后我可以将它注入我的面板,页面和任何其他wicket组件。我还可以绑定面板和其他自定义组件,以便我可以根据需要将它们注入其他组件。但是我没有找到需要绑定和注入用户界面组件的情况。