2011-11-23 3 views
2

아래에 설명 된 구조로 시스템에 대한 종속성 주입을 구조화하는 가장 좋은 방법에 대한 제안과 피드백이 필요합니다. 저는 Guice를 사용하고 있으므로 XML 중심의 Spring 스타일 구성이 아닌 주석 기반 선언이 중심 인 솔루션을 선호합니다.종속성 주입을위한 적절한 구조 (Guice 사용)

Ball, Box, and Tube (각각 Logger에 종속 됨)의 유사한 객체 세트가 생성자를 통해 제공된다고 가정합니다. (중요하지 않을 수도 있지만 네 가지 클래스는 모두 단일체가됩니다. 응용 프로그램은 Gang-of-Four가 아니라 다양 함)

ToyChest 클래스는 세 가지 모양 객체를 만들고 관리합니다. ToyChest 자체는 모양 개체를 만드는 것을 제외하고는 Logger에 종속되지 않습니다.

ToyChest 클래스는 Main 클래스의 응용 프로그램 단독으로 인스턴스화됩니다.

ToyChest에 도형을 구성하는 가장 좋은 방법에 대해 혼란스러워합니다. 나는 (1) Guice Injector 인스턴스에 이미 Module 바인딩을 부착하거나 Logger 바인딩을 구현해야하거나 (2) 오른쪽에 이라는 새 번호를 추가로 생성해야합니다.

(1)은 ToyChest@Inject Injector injector 필드를 추가하여 이루어 지지만 ToyChest에는 실제로 인스턴스가 생성되지 않는 자식 인스턴스가 있기 때문에 이상하게 느껴집니다.

(2)의 경우 적절한 방법을 전달하는 방법이 확실하지 않습니다. Module

올바른 경로에 있습니까? 이 구조를 구성하는 더 좋은 방법이 있습니까?

question에 대한 대답은 인젝터를 직접 사용하는 대신 Provider으로 전달되지만, 어떻게 작동해야하는지 잘 모르겠습니다.

편집 :

아마도 더 간단한 질문입니다 : Guice를 사용하여 언제, 어디서 모양의 물체를 구성하는 적절한 장소는? ToyChest은 그 (것)들을 가진 몇몇 윤곽을 할 것이다, 그러나 나는 다른 곳에 건설 될 수 있었다는 것을 가정한다. ToyChest (컨테이너를 관리하는 컨테이너로 사용)이 아니라 Main이 아니라 적절한 장소를 좋아하는 것 같습니다.

+0

볼, 상자 및 튜브는 모두 응용 프로그램 싱글 톤이지만 ToyChest에서 만들었습니까? 이것이 왜 필요한지 명확히 할 수 있습니까? 그것이 만들어 졌을 때 ToyChest에 대신 주어질 수 있었습니까? –

+0

1) ToyChest가 생성 된 것을 결정합니다. 2) 생성자를 통해 ToyChest에 전달 될 수 있지만 다른 곳에서는 필요하지 않습니다. 그래서 그것은 내 생각에 불필요하게 생성자를 복잡하게 만들 것입니다. 또한 거북이 - 모든 - 다운 문제가 있습니다. ToyChest에 전달할 수있는 요소는 무엇입니까? 아마도 생성자를 통해 그들을 전달하는 것은 올바른 방법이며, 나는 더 큰 구조를 보지 않고 있습니다. –

답변

3

올바른 방법은 guice가 의존성을 구성하도록하는 것입니다. 그것이 생성 및 구성입니다.

상황에 따라 Main에 인젝터가 있어야합니다. 인젝터에서 당신은 ToyChest이됩니다. 인젝터를 통해 ToyChest을 얻을 때 guice가 관리하며 적절하게 구성된 모든 종속성을 제공 할 수 있습니다.

Provider<Ball>, Provider<Box> 등을 ToyChest에 삽입 할 수 있으며 필요한 경우 공급자로부터 인스턴스를 검색하면됩니다. ToyChest은 인스턴스를 생성하고 사용하는 데 책임이 없습니다. 플러그인 아키텍처가있는 경우 MapBinder을 확인할 수도 있습니다.

지금까지 모든 것이 guice에 의해 관리되기 때문에 셰이프는 클래스를 사용하지 않고 로거를 주입 할 수 있습니다.

새로 만든 쉐이프 인스턴스에 전달할 런타임 매개 변수가있는 경우 AssistedInject을 사용할 수 있습니다.

힌트 : 생성자 삽입을 사용하지 않아도됩니다. 생성자를 단순화하는 필드 나 설정자를 삽입 할 수 있습니다.

+0

감사합니다. 이것은 질문을 한 후에 나왔다는 결론을 뒷받침하고 고려해야 할 다른 옵션을 제안합니다. ToyChest 생성자/세터 또는 통해 모양을 수용하거나이 모양을 얻을 수있는 공장/제공/mapbinder에 동의하여 중, DI 인식 할 필요가있다. 제 전화 끊기가 저의 많은 부분을 뒤집어 쓴다고 생각합니다! –