Jak używać Google Guice do tworzenia obiektów wymagających parametrów?

Może jestem po prostu ślepy, ale nie widzę, jak użyć Guice (dopiero zaczynającego się od niego), aby zastąpić wywołanie new w tej metodzie:

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

Do testowania może być inna implementacja procesora, więc chciałbym uniknąć wywołania new i w jego trakcie pozbyć się zależności od implementacji.

Gdyby moja klasa pamiętała instancję procesora, mógłbym wstrzyknąć ją przez konstruktor, ale ponieważ procesory są zaprojektowane tak, aby były niezmienne, potrzebuję za każdym razem nowy.

Jak mógłbym to osiągnąć za pomocą Guice (2.0) ?

Author: Daniel Schneller, 2009-06-15

3 answers

Minęło trochę czasu odkąd używałem Guice 'a, ale pamiętam coś, co nazywa się"wspomagane wstrzykiwanie". Pozwala na zdefiniowanie metody fabrycznej, w której niektóre parametry są dostarczane, a niektóre są wstrzykiwane. Zamiast wstrzykiwać procesor, wstrzykuje się fabrykę procesora, która ma metodę fabryczną, która pobiera parametr anInputValue.

Wskazuję javadoc Faktoryprovider . Uważam, że powinien być użyteczny dla Ciebie.

 27
Author: waxwing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 14:13:05

Możesz uzyskać pożądany efekt, wstrzykując "dostawcę", który może zostać poproszony w czasie wykonywania o podanie procesora. Dostawcy zapewniają możliwość odroczenia budowy obiektu do momentu złożenia wniosku.

Są one pokryte w dokumentacji Guice tutaj i tutaj.

Dostawca będzie wyglądał jak

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

Ponieważ dostawcy są konstruowani i wstrzykiwani przez Guice, sami mogą mieć wstrzykiwane bity.

Twój kod będzie wyglądał jak coś jak

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

public boolean myMethod(String anInputValue) {
    return processorProvider.get().isEnabled(anInputValue);
}
 9
Author: Dave W. Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-26 05:47:56

Czy Twój procesor potrzebuje dostępu do anInputValue przez cały jego cykl życia? Jeśli nie, czy wartość może zostać przekazana do wywołania metody, której używasz, coś w stylu:

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

public boolean myMethod(String anInputValue) {
    return processor.isEnabled(anInputValue);
}
 2
Author: tddmonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 15:17:08