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

Dependency injection 如何在wicket中使用依赖项注入?,dependency-injection,ioc-container,wicket,Dependency Injection,Ioc Container,Wicket,如何将以下示例转换为使用wicket/IOC集成包之一 我想学习和理解DI/IOC模式。我读了很多关于它的书,但我发现如果不深入研究代码示例,就有点难以理解。我有一个完整的、可工作的Wicket面板的示例,我想我想将其转换为使用DI 该面板基本上是列表的web UI编辑器。它将IPanelFactory作为构造函数参数。构造函数创建一个列表(DefaultRefreshingView),面板工厂知道如何为每一行创建一个ViewPanel。panelFactory还知道如何创建add表单,以便将新

如何将以下示例转换为使用wicket/IOC集成包之一

我想学习和理解DI/IOC模式。我读了很多关于它的书,但我发现如果不深入研究代码示例,就有点难以理解。我有一个完整的、可工作的Wicket面板的示例,我想我想将其转换为使用DI

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

我将删去大量代码,以触及我认为相关的核心内容:

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 扩展IDetachable{ IAddItemPanel newAddItemPanel(字符串id); 组件newEditPanel(ViewPanel.ViewPanelParameters parms); 组件newListPanel(字符串id,IModel listModel); } 公共类ListedTorPanel2 扩展面板实现IHeaderContributor{ 私有静态最终长serialVersionUID=1L; 私人最终IPanelFactory panelFactory; public ListEditorPanel2(字符串id、IModel listModel、, 最终IPanelFactory Panel(工厂){ super(id,listModel); this.panelFactory=panelFactory; 最终AjaxCell列表单元格=新AjaxCell(“列表单元格”); DefaultRefreshingView项目列表=新建DefaultRefreshingView( “项目列表”,列表模型){ @凌驾 受保护的无效填充项(最终项){ Component editPanel=ListEditorPanel2.this.panelFactory .newEditPanel(新的viewPanel参数(“viewPanel”), getModel(),新的EditPanelCallback(item)); 添加项(编辑面板); } }; 添加(itemList); 添加(列表单元格); 最终IAddItemPanel addItemPanel=面板工厂 .newAddItemPanel(“addItemForm”); 添加((成分)addItemPanel); Form Form=addItemPanel.getForm(); } } IPanelFactory的每个实现都为视图和添加部分提供了不同的组件。ListEditorPanel2可以有多个实例在同一页面层次结构中使用不同的工厂实现

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

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

我不太理解您的用例,但无论如何我都会尝试回答您的问题。 Wicket非常支持两个最流行的DI容器,即Spring和Guice。就我个人而言,我更喜欢使用guice,因为我发现它不那么臃肿,更易于使用。您需要了解guice是如何工作的以及guice模块是如何创建的。要将wicket应用程序与guice集成,请在wicket应用程序初始化方法上执行如下操作:

Injector injector = Guice.createInjector(new   AppModule(),PersistenceService.usingJpa().across(UnitOfWork.REQUEST).buildModule());
addComponentInstantiationListener(new GuiceComponentInjector(this, injector));
这里我用两个模块实例化了一个guice注入器,即appModule和Persistence module(忽略persistenceModule的详细信息。我使用warp persist处理事务)


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

谢谢!我已经找到了一个wicket spring配置,它允许我注入DAO。我正在玩一点,我可能会读一读Guice,看看它是如何比较的。