如何将以下示例转换为使用其中一个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成为一个注入依赖项。所以......
答案 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组件。我还可以绑定面板和其他自定义组件,以便我可以根据需要将它们注入其他组件。但是我没有找到需要绑定和注入用户界面组件的情况。