개찰구 의존성 주입
-
05-09-2019 - |
문제
개찰구에 양식이있는 페이지가있어 양식에 공동 작업자가 작업을 완료해야합니다. 공동 작업자가 주입되어 (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();
}
}
}
등록 서비스가 필요한 등록 형식 일 때 등록 영역에 주입된다는 생각이 마음에 들지 않습니다. 등록 서비스를 변경하여 등록 서비스를받을 수 있습니다.
public RegistrationForm(RegistrationService service) {
this.service = service;
}
등록 페이지에서 필드를 제거하지만 등록 페이지는 여전히 패스 스루를 수행하는 데 사용되고 있습니다.
내가 묻는 것은이 작업을 수행하기위한 모범 사례가 무엇인가? 이것이 괜찮습니까?
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();
}
}
나는 별도의 클래스/파일로 등록 형식을 갖고 싶어서 이것을 선호합니다. 나는 개찰구를 처음 접했기 때문에 표준이 무엇인지 확신 할 수 없다 - 누군가 나에게 안내 빛을 보여줄 수 있습니까? :)
해결책
개찰구+IOC의 기본 패러다임은 다음과 같습니다. 대부분의 종속성은 세터 주입을 통해 주입해야합니다. 웹 페이지에는 생성자 주입이 불가능합니다.
구성 요소/패널/양식/페이지는 반복 끝에만 있어야합니다.
따라서 의존성을 주입하십시오 RegistrationService
행복하게 RegistrationForm
, 그런 다음 add (new registrationform ())을 사용하여 등록 페이지에서 작성하십시오.
개찰구에는 icomponentInstantiationListener가 있습니다. 그 중 하나는 기체입니다. 각 구성 요소/웹 페이지의 생성자 중에 알림을받습니다. 따라서 Code의 일부 부분이 실행되기 전에 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();
}
}
}
페이지 내부에 등록 정보를 내부 클래스로 넣기로 결정한 경우 정적을 선언하십시오! 당신은 대부분 동봉 클래스에 대한 언급이 필요하지 않을 것입니다.
다른 팁
제 생각에는 개찰구에 대한 DI는 하나의 혼란스러운 요소를 가지고 있으며 구성 요소 나 페이지에서는 자동으로 수행되지만 모델에는 없습니다. 내 의견으로는 정확히 모델 (페이지가 아님)은 JPA 등에 의존적이어야합니다.
공식 문서는 사용하라고 말합니다 InjectorHolder.getInjector().inject(this)