Как использовать Dependency Injection с калиткой? - PullRequest
0 голосов
/ 16 сентября 2010

Как преобразовать следующий пример для использования одного из пакетов интеграции wicket / IOC?

Я хочу изучить и понять шаблон DI / IOC.Я много читал об этом, но мне было трудно понять, не углубляясь в пример кода.У меня есть пример полной работающей панели Wicket, которую, я думаю, я хочу преобразовать в DI.

Панель - это, по сути, редактор веб-интерфейса для списка.Он принимает 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 предоставляет различные компоненты для разделов «Просмотр» и «Добавление».Может быть несколько экземпляров ListEditorPanel2, которые используют разные реализации фабрики в одной и той же иерархии страниц.

Я думаю, что я хочу, чтобы IPanelFactory была внедренной зависимостью.Итак ...

  • Это хороший вариант использования для DI / IOC, или нет смысла использовать его здесь?
  • Как бы я сделал это "вручную"без использования контейнера IOC?(Я уже делаю это?)
  • Какую интеграцию wicket-IOC мне следует использовать?Я использую калитку 1.4.8 в настоящее время.Я собирался попробовать wicket-spring-annot, но похоже, что этот проект устарел.
  • Как мне настроить контейнер IOC для этого для моих компонентов калитки?

1 Ответ

1 голос
/ 24 сентября 2010

Я не совсем понимаю ваш вариант использования, но все равно постараюсь ответить на ваш вопрос. У Wicket есть отличная поддержка 2 самых популярных DI-контейнеров, а именно Spring и Guice. Лично я предпочитаю использовать guice, так как я нахожу его менее раздутым и более простым в использовании. Вы должны понимать, как работает guice и как создаются модули guice. Чтобы интегрировать ваше приложение для калитки с guice, вы должны сделать что-то похожее на метод инициализации вашего приложения для калитки:

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

Здесь я создаю экземпляр инжектора guice с двумя модулями, а именно с модулем appModule и Persistence (игнорируйте детали persistenceModule. Я использую warp persist для транзакций)

В модуле guice вы связываете все компоненты, которые хотели бы вводить. Я в основном связываю свои Даос и мои услуги. Затем я могу добавить то же самое в мои панели, страницы и любой другой компонент калитки. Я также могу связать панели и другие пользовательские компоненты, чтобы добавить их к другим компонентам как необходимые. Однако я не нашел ситуации, когда мне нужно будет связать и внедрить компонент пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...