检票依赖注入

tddmonkey:

我在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仅注入需要它的RegistrationForm的情况。我可以更改RegistrationForm以接收RegistrationService:

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

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

我想我要问的是这样做的最佳实践是什么?可以这样做,还是将RegistrationForm本身注入到Page中可能更好:

   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();
        }
    }

我更喜欢这样做,因为我希望将RegistrationForm放在单独的类/文件中。我对Wicket还是很陌生,所以不确定什么是规范-有人可以向我展示指导思想吗?:)

安德烈亚斯·彼得森(Andreas Petersson):

wicket + ioc的基本范例是:大多数依赖项应该通过setter注入来注入。WebPage无法进行构造函数注入。

组件/面板/表格/页面仅应在接收端。

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

小门有IComponentInstantiationListener-其中之一是guice。他们在每个组件/网页的构造过程中得到通知。因此,您的RegistrationForm将在其代码的任何部分可以执行之前注入其依赖项。

我会做的方式:(当然RegistrationForm可以在另一个文件中)

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();
    }
}
}

如果您决定将RegistrationForm作为内部类放在Page内部,请记住将其声明为静态!您很可能不需要对封闭类的任何引用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章