4

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

RegistrationForm だけが必要な場合に、RegistrationService が RegistrationPage に挿入されるという考えは好きではありません。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を別のクラス/ファイルに入れたいので、これをお勧めします。私は Wicket にまったく慣れていないので、標準が何であるかがわかりません。誰かが私に導きの光を見せてくれませんか? :)

4

2 に答える 2

3

wicket+ioc の基本的なパラダイムは次のとおりです。ほとんどの依存関係は、setter インジェクションを介して注入する必要があります。WebPages では、コンストラクター インジェクションは不可能です。

コンポーネント/パネル/フォーム/ページは、受信側にのみ配置する必要があります。

そのため、依存関係を にRegistrationService喜んで注入しRegistrationForm、add(new RegistrationForm()); を使用して RegistrationPage に作成します。

wicket には IComponentInstantiationListener があります - そのうちの 1 つが guice です。各コンポーネント/Web ページのコンストラクター中に通知を受け取ります。そのため、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 内に内部クラスとして配置することにした場合は、忘れずに静的に宣言してください。囲んでいるクラスへの参照はほとんど必要ありません。

于 2009-03-19T21:20:46.337 に答える
0

私の意見では、Wicket の DI には紛らわしい要素が 1 つあります。コンポーネントまたはページでは自動的に行われますが、モデルでは行われません。私の意見では、モデル(ページではなく)がJPAなどに依存する必要があります。

公式ドキュメントは使用すると言いますInjectorHolder.getInjector().inject(this)

于 2015-09-03T16:14:45.073 に答える