2011-09-13 2 views
2

누군가가 이미있을 수있는 상황에 있습니다. 응용 프로그램에서 GWTP를 사용하고 있습니다. GWTP는 GIN을 클라이언트 쪽 종속성 주입으로 사용하고 있습니다. 또한 GWTP는 서버 측에 요청을 보내기 위해 Dispatcher 메커니즘을 사용합니다.GWT - GIN - GWTP - 디스패처 주입 문제

이제는 GWTP에 의해 주입되는 몇 가지 클래스 (PRESENTERS)가 있습니다. 주입을하지 않고 런타임에 생성되는 "새로운"키 작업을 사용하는 다른 클래스가 있습니다. 예를 들어 보겠습니다 :

// Injected 
class Dispatcher { 
} 

// Injected 
Class A { 
    @Inject // I can do this and access the disp without any hurdle. 
    Dispatcher disp; 
} 

// Created using "new" keywork 
class B { 
    //@Inject I can't do this because of B is not an injected class. Correct me if I am wrong here 
    Dispatcher disp; 
} 

그래서 주입되지 않은 클래스에서 주사 된 클래스에 액세스해야합니다. 내가 GWT.Create (Injector.class) 메서드를 사용해 보지 않았다고 생각할 수도 있습니다. 나는 그것을 시도해 보았지만 nonopected 클래스에서 그 객체를 얻을 수 있었지만 객체 Dispatcher는 그것의 기본 URL에 "/ dispatch /"를 증가 (추가)하는 어떤 다른 것이다. 즉, 내부적으로 사용하는 GWTP와 동일한 객체를 가질 필요가 있음을 의미합니다. 그리고 GWTP는 진입 점에 GIN INJECTOR를 만듭니다.

하나의 솔루션은 동일한 GIN INJECTOR를 클라이언트 측 세션 (정적 해시 맵)에 넣고 비 주입 클래스에서 사용하는 것입니다 (이 솔루션을 사용해도 매력적입니다).

나는 일할 수있는 완벽한 솔루션이 더 필요합니다.

미리 감사드립니다.

답변

4

주사는 (좋은) 바이러스와 유사합니다. 사용을 시작하면 소스 코드가 확산됩니다.

앞에서 말씀 드린대로 'new'라는 키워드를 사용하여 생성 된 개체에는 인스턴스를 삽입 할 수 없습니다. 당신이 (GWT.create(MyInjector.class)를 통해) 귀하의 인젝터를 만들 때

  • 공공 정적 변수에 할당 : 나는 , 빠른 더러운 권장되지 대안의 몇 가지 생각할 수 있습니다. MyInjector에는 getDispatcher() 메서드가 있어야 Dispatcher을 반환합니다. 이것은 정말 더러운 대안이며, 사용하지 않는 모든 구성 요소는 테스트하기가 매우 어려울 것이므로이 방법을 사용하지 않는 것이 좋습니다.
  • B의 인스턴스를 만드는 사람은 누구입니까? 주사를 사용하여 생성 된 객체를 찾을 때까지 계층 구조를 탐색 한 다음 을 삽입하고 B의 생성자까지 모두 전달합니다.

이제 디자인을 검토하는 것이 좋습니다. 일반적으로 모든 클래스에 비즈니스 로직을 주입해야합니다. Dispatcher을 전달하는 경우 B은 비즈니스 로직을 실행하므로 이되어야한다고 가정합니다.

+0

@ Luishmahou : 당신과 동의하십시오. 나는 양자 택일을 시도했다. 둘 다 그들의 자리에서 일했습니다. 그러나 첫 번째 대안은 내 상황에 더 적합하다고 생각합니다. 분리 관리자를 계층 구조 수준으로 전달하면 내게 훨씬 어려운 작업이 될 것이기 때문입니다. 그래서 정적 hashmap으로 클라이언트 쪽 세션을 생성하고 한 번 그 해시 맵에 MyInjector를 만들었습니다. 이제 원하는 인스턴스를 얻을 수 있습니다. 그러나 그것을 그것을하는 정확한 방법입니까 ???? –

+0

해결책은 제 대답의 마지막 단락에 있습니다. 수업을 리팩터링하여 주입 할 수 있어야합니다. GIN을 사용하기 시작했을 때 나는 동일한 문제를 겪었고 주사기를 잡고 다른 응용 프로그램과 유사한 Dispatcher 및 유사한 인스턴스를 전달하기 위해 정적 변수를 사용했습니다. 그러나 이로 인해 구성 요소를 테스트하기가 어렵습니다.조금씩 나는 프로젝트를 리팩터링했고 이제는 모든 것이 주입되고 테스트 할 수 있습니다. – Luismahou

+0

좋습니다. 내가 그 다음에 똑같은 일을 시키자 .... 감사합니다. –