2009-06-15 12 views
21

Może jestem po prostu ślepy, ale nie widzę, jak korzystać Guice (dopiero zaczynają z nim), aby zastąpić połączenia new w tej metodzie:Jak używać Google Guice do tworzenia obiektów wymagających parametrów?

public boolean myMethod(String anInputValue) { 
    Processor proc = new ProcessorImpl(anInputValue); 
    return proc.isEnabled(); 
} 

Do testów nie może być inna implementacja procesora , więc chciałbym uniknąć wywołania new iw ten sposób pozbyć się zależności od implementacji.

Jeśli moja klasa może po prostu zapamiętać instancję procesora, mógłbym ją wprowadzić za pośrednictwem konstruktora, ale ponieważ procesory są zaprojektowane jako niezmienne, potrzebuję za każdym razem nowego.

W jaki sposób chciałbym osiągnąć ten cel dzięki Guice (2.0)?

Odpowiedz

27

Jest trochę czasu, odkąd użyłem Guice teraz, ale pamiętam coś zwanego "wspomaganym zastrzykiem". Umożliwia zdefiniowanie metody fabrycznej, w której niektóre parametry są dostarczane, a niektóre są wstrzykiwane. Zamiast wstrzykiwać procesor wstrzykujesz fabrykę procesorów, która ma fabryczną metodę, która przyjmuje parametr anInputValue.

Wskazuję na javadoc of the FactoryProvider. Uważam, że powinno być użyteczne dla ciebie.

+7

Tak, AssistedInject jest najlepszym rozwiązaniem. http://code.google.com/p/google-guice/wiki/AssistedInject –

+1

Oto krótki post, który o nim napisałem. Assisted Injection to wspaniałe narzędzie do rozwiązywania niektórych problemów i uważam, że nie jest tak dobrze znany. Dobra robota rozpowszechniająca wiedzę. http://ripper234.com/p/assisted-injection-in-guice/ – ripper234

+0

Gdzie mogę uzyskać .jar do wspomaganego wstrzykiwania? Nie można go pobrać z http://code.google.com/p/google-guice/downloads/list. –

2

Czy Twój procesor potrzebuje dostępu do anInputValue przez cały cykl życia? Jeśli nie może być wartością przekazany do metody zadzwonić używasz, coś jak:

@Inject 
public MyClass(Processor processor) { 
    this.processor = processor; 
} 

public boolean myMethod(String anInputValue) { 
    return processor.isEnabled(anInputValue); 
} 
+0

Implementacje procesorów zostały zaprojektowane tak, aby były niezmienne, tworząc je jednokrotnie z wszystkimi potrzebnymi danymi, a następnie prosząc je o rzeczy. –

9

można uzyskać pożądany efekt poprzez wstrzyknięcie „Provider”, który może być pytani w czasie pracy, aby dać jesteś procesorem. Dostawcy zapewniają sposób odroczenia budowy obiektu do czasu jego zażądania.

Są one objęte dokumentami Guice here i here.

Dostawca będzie wyglądać

public class ProcessorProvider implements Provider<Processor> { 
    public Processor get() { 
     // construct and return a Processor 
    } 
} 

Od Providers są skonstruowane i wstrzykuje przez Guice, sami mogą mieć bity wstrzykiwana.

Twój kod będzie wyglądać

@Inject 
public MyClass(ProcessorProvider processorProvider) { 
    this.processorProvider = processorProvider; 
} 

public boolean myMethod(String anInputValue) { 
    return processorProvider.get().isEnabled(anInputValue); 
} 
+0

Wielkie dzięki, to wydaje się być tym, czego szukałem. Czasami nie widać lasu dla wszystkich drzew. –

+0

A będziesz chciał powiązać DebugProcessorProvider z modułami debugowania, ale jeśli korzystasz z Guice, prawdopodobnie już to rozgryzłeś. –

+1

Widząc jak interfejs API został zmieniony na Process.isEnabled (anInputValue) (tak jak w mojej odpowiedzi), po co zawracać sobie teraz Dostawcę?Dlaczego nie masz tylko jednego procesora i całkowicie pomiń dostawcę? – tddmonkey

Powiązane problemy