代码之家  ›  专栏  ›  技术社区  ›  tddmonkey

Wicket依赖注入

  •  4
  • tddmonkey  · 技术社区  · 17 年前

    我在Wicket中有一个表单页面,表单需要一个合作者来完成它的工作。协作者被注入(我正在使用Guice),看起来像:

    public class RegistrationPage extends WebPage {
        @Inject
        public RegistrationPage(RegistrationService service) {
            this.service = service;
            add(new RegistrationForm());            
        }
    
        private class RegistrationForm extends Form {
            public RegistrationForm() {
                // setup
            }
    
            protected void onSubmit() {
               service.doSomething();
            }
        }
    }
    

    我不喜欢将RegistrationService注入RegistrationPage的想法,因为它只是需要RegistrationForm。我可以更改注册表单以接收注册服务:

    public RegistrationForm(RegistrationService service) {
        this.service = service;
    }
    

    并从RegistrationPage中删除该字段,但RegistrationPage仍用于传递。

    我想我要问的是做这件事的最佳实践是什么?这样做可以吗,或者将RegistrationForm本身注入页面会更好:

       public class RegistrationPage extends WebPage {
            @Inject
            public RegistrationPage(RegistrationForm form) {
                add(form);
            }
       }
    
       ---
    
       private class RegistrationForm extends Form {
            private RegistrationService service;
    
            @Inject
            public RegistrationForm(RegistrationService service) {
                this.service = service;
            }
    
            protected void onSubmit() {
               service.doSomething();
            }
        }
    

    2 回复  |  直到 17 年前
        1
  •  3
  •   Andreas Petersson    17 年前

    wicket+ioc的基本范例是:大多数依赖项应该通过setter注入来注入。对于网页,构造函数注入是不可能的。

    组件/面板/表单/页面应仅位于接收端。

    因此,将依赖项注入到 RegistrationService RegistrationForm ,然后使用add(new RegistrationForm())在RegistrationPage中创建它;

    wicket有IComponentInstanceListener,其中之一是guice。在每个组件/网页的构建过程中,他们会得到通知。因此,在执行代码的任何部分之前,您的注册表单都将注入其依赖项。

    我会这样做: (当然,注册表格可以在另一个文件中)

    public class RegistrationPage extends WebPage {
    
    @Inject
    public RegistrationPage() {
        add(new RegistrationForm());            
    }
    
    ---
    private static class RegistrationForm extends Form {
       RegistrationService service;
    
          @Inject
         public void setRegistrationService (RegistrationService  service){
         this.service = service;
            }
        public RegistrationForm() {
            // setup
        }
    
        protected void onSubmit() {
           service.doSomething();
        }
    }
    }
    

        2
  •  0
  •   Jacek Cz    10 年前

    在我看来,Wicket上的DI有一个令人困惑的元素,它是在组件或页面上自动完成的,而不是在模型中。在我看来,确切地说,模型(而不是页面)应该依赖于JPA等。

    官方文件说要用吗 InjectorHolder.getInjector().inject(this)

    推荐文章