2015-01-10 2 views
4

나는 "factory"클래스를 기반으로 올바른 인스턴스를 반환하는 Factory 클래스를 사용하여 클래스의 인스턴스를 만들기 전에 표준 팩토리 패턴 메서드를 사용했습니다. 매개 변수 (아래 주어진 예제 스 니펫) :GoF를 사용하는 GoF 표준 팩토리 패턴

이제는 의존성 주입을 위해 프로젝트에서 Guice를 사용하고 있습니다. 제 질문은 Guice를 사용하여 위와 같은 것을 어떻게 얻을 수 있습니까? 어떤 구현 인스턴스가 필요한지는 런타임에 일부 사용자 입력을 기반으로 결정됩니다.

저는 Provider와 @Named 주석을 살펴 봤습니다. 그러나 나는 그것이 정확히 나를 어떻게 도울 것인지 이해하지 못한다.

+0

내가 인스턴스를 필요로하는 코드 공장 (또는 인젝터를 지시하는 경우를 들어, 당신이하려고하지만 의존성 주입의 아이디어에 대해 다소하지 정확히 모르겠어요 그 문제) 구현하고자하는 것은 무엇입니까? – 5gon12eder

+0

제 경우에는 특정 작업 처리기 클래스를 작성하고 있습니다. 특정 작업을 수행하도록 허용하지만 수행 된 사용자 작업을 기반으로 올바른 작업 처리기의 인스턴스를 가져와야합니다. – user1790625

+0

아래에 내 대답을 게시 한 후, 나는 몇 가지 검색을 수행하고 [여기] (http://stackoverflow.com/questions/17669413/can-guice-automatically-create-instances-of-different-classes-based- on-a-paramet)보다 훨씬 더 좋은 답을 얻을 수 있습니다. – The111

답변

2

일반적으로 대부분의 종속성을 주입하는 팩토리가 있지만 클라이언트가 제공하는 일부 클라이언트를 허용하는 문제의 경우 Factories by Assisted Injection을 사용합니다.

그러나이 경우 이는 공장에서 조건부 논리로 이어질 수 있습니다. 이상적인 것은 아닙니다 (Guice 모듈에서는 명시 적으로 discouraged입니다).

나는 당신의 상황에 대해 MapBinder이 이상적이라고 생각하며, 당신은 단지 데이터 타입을 바꾸고 아무것도 만들지 않기 때문에 공장을 전혀 필요로하지 않을 것이다. 귀하의 모듈에서 (귀하의 경우) 키의 맵을 SimpleObjectInterface의 의미로 구성하십시오. 그런 다음 기본 런타임 클래스에서지도를 삽입하고 간단한 객체의 인스턴스가 필요할 때 data을 사용할 수있는 경우 삽입 된지도에서 get(data)을 호출합니다.

내가이 컴퓨터에 IDE가없는, 그래서 코드를 테스트 할 수는 없지만 메모리에서 아래와 같은 것이다 :에서

public class MyModule extends AbstractModule { 
    protected void configure() { 
    MapBinder<Integer, SimpleObjectInterface> mapbinder 
     = MapBinder.newMapBinder(binder(), Integer.class, SimpleObjectInterface.class); 
    mapbinder.addBinding(1).toClass(OneSimpleObject.class); 
    mapbinder.addBinding(2).toClass(TwoSimpleObject.class); 
    } 
} 

:

모듈에서 앱 코드 : 여기에

@Inject 
private Map<Integer, SimpleObjectInterface> simpleObjectMap; 

... 

void applicationCode() { 
    ... 
    Integer data = getData(); 
    SimpleObjectInterface simpleObject = simpleObjectMap.get(data); 
    ... 
} 

만 문제는 당신이 당신의 switch 문에 있다고 "기본"구속력을 가질 수있다. 그것을 처리하는 가장 좋은 방법은 확실하지 않습니다. 어쩌면지도 바인더에서 객체를 인스턴스화하려고 시도한 후에도 객체가 여전히 null 인 경우 응용 프로그램 코드에 기본 impl을 할당 할 수 있습니다. 또는 조건부 논리를 사용하여 보조 주입으로 되돌아 갈 수 있지만, 유일한 의존성이 클라이언트가 제공하는 경우 실제로 "보조"분사가 아닙니다.

은 참조 : Can Guice automatically create instances of different classes based on a parameter?

+0

좋아요. 답변 주셔서 감사합니다. – user1790625