我有一个网页,在检票一种形式,形式要求合作者,以获取其完成工作。合作者注入(为此我使用吉斯),看起来是这样的:

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。我可以改变RegistrationForm以接收RegistrationService:

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

我宁愿这是我想在一个单独的类/文件RegistrationForm。我是很新的检票口,从而不能确定的标准是什么 - 有人可以告诉我的指路明灯? :)

有帮助吗?

解决方案

与检票口+ IOC的基本模式是:大多数依赖应通过setter注入被注入。构造注射网页是不可能的。

部件/面板/形式/网页应仅是对recieving端。

所以,注入的依赖性愉快地RegistrationServiceRegistrationForm,然后用添加RegistrationPage创建它(新RegistrationForm());

便门具有IComponentInstantiationListener - 它们中的一个是吉斯。他们每个部件/网页的构造过程中得到通知。所以你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,记得要声明它的静态!你很可能并不需要封闭类的任何引用。

其他提示

在上检票我看来DI具有一个令人困惑的元件,对元件或页面而不是在模型自动地完成的。在我看来正是模型(而不是页面)应该依赖于JPA等。

官方文档说使用InjectorHolder.getInjector().inject(this)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top