2010-09-29 16 views
7

Tworzę bibliotekę, która będzie dołączona jako słoik, więc nie będzie zawierała głównej metody. Zastanawiam się, jaka jest najlepsza praktyka do ładowania Guice w tym przypadku. Mam jeden singleton na najwyższym poziomie.Używanie Guice bez głównej metody

public class TestManager 
{ 
    private TestManager() 
    { 
    } 

    public static TestManager getInstance() 
    { 
     // construct and return singleton 
    } 

    public void createSomeObjects() 
    { 
    } 

} 

Gdzie powinienem założyć Guice? Myślałem, że w konstruktorze mogę nazwać Guice.createInjector (new Module()); ale nie wstrzyknąłby żadnego z obiektów utworzonych w createSomeObjects().

Czy istnieje typowy sposób, aby to zrobić, gdy nie masz głównej metody()?

Pozdrawiam.

Odpowiedz

8

Podobnie jak konfiguracjach rejestrowania, jeśli jest to prawdą, biblioteka następnie opcje są dość dużo tego:

  • Powiedz użytkownika biblioteki, które są odpowiedzialne za bootstrapu samych Guice.
  • Podaj biblioteki inicjalizacji metodę że dba o bootstrapu Guice, jeśli chcą korzystać z biblioteki

Próbując zrobić super-inteligentnych, aby zrobić własny konfigurację biblioteki często kończy się nieco sztywne, twarde do testowania hierarchii klas.

+5

Dawanie klientom modułu Guice może dobrze działać. –

+1

+1 dla super-inteligentnej samokonfiguracji. Pomyśl tylko, jak źle poszło z Logowaniem Apache Commons. –

+0

@Jesse, nigdy nie widziałem bibliotek, które używają Guice wewnętrznie wystawiają go użytkownikom końcowym. Na przykład Maven i JIRA używają IoC za kulisami, ale wstrzykują do twoich klas, nie wiedząc, której implementacji używają. Odsłaniając Guice brzmi czystsze (jeśli użytkownik czuje się komfortowo z Guice), ale obawiam się, że może to odstraszyć użytkowników (dlaczego nikt inny tego nie robi?). – Gili

0

To nie jest to, czego powinny zrobić, ale co mógłby temat:

Niech kluczowe zajęcia w bibliotece lub w inny sposób przedłużyć odwołać klasy, która inicjuje wszystko statycznego bloku. To bardzo brudny hack, ale jeśli upewnisz się, że twój api nie będzie dostępny bez ładowania klasy inicjalizatora klasy, powinieneś być po bezpiecznej stronie.

Możesz zrobić to nieco czystszym, jeśli użyjesz AspectJ i wstrzykniesz prywatnego członka typu inicjatora do wszystkich klas w bibliotece (bez dotykania kodu Java), ale nadal będzie to hack.

0

Jeśli używasz tylko Guice w zakresie biblioteki, a nie dla całej aplikacji, możesz użyć bloku statycznego w klasie TestManager.

Ta strategia zakłada, że ​​aplikacja w pewnym momencie zadzwoni pod numer TestManager.getInstance() i że jest to jedyny punkt wejścia do interfejsu API.

@Singleton 
class TestManager { 

    private static final TestManager INSTANCE; 

    static { 
    INSTANCE = Guice.createInjector(new Module()).getInstance(TestManager.class); 
    } 

    private TestManager() { 
    } 

    public static TestManager getInstance() { 
     return INSTANCE; 
    } 

    @Inject 
    public void createSomeObjects(YourDependencies ...) { 
    // Do something with dependencies 
    } 
} 
Powiązane problemy