2016-09-19 2 views
0

я создаю инжектор:Google Guice не может работать с двумя модулями

private static Injector mvpInjector = Guice.createInjector(
    HandlingModule.getInstance(), 
    StorageModule.getInstance() 
); 

Тогда я пытаюсь получить экземпляр класса:

mvpInjector.getInstance(ImageCreatePresenter.class).showImageCreateWindow(); 

Это класс конструктор, который нужно впрыскивать:

@Inject 
public ImageCreatePresenterImpl(ImageCreateView imageCreateView, StorageHelper storageHelper, ImageCreater imageCreater) { 
    this.imageCreateView = imageCreateView; 
    this.storageHelper = storageHelper; 
    this.imageCreater = imageCreater; 
} 

Но, во Inject, бросить исключение:

Exception in thread "main" com.google.inject.CreationException: Unable to create injector, see the following errors: 

1) No implementation for com.dugin.rostislav.StorageHelper was bound. 
    while locating com.dugin.rostislav.StorageHelper 
    for parameter 1 at com.dugin.rostislav.presenter.ImageCreatePresenterImpl.<init>(ImageCreatePresenterImpl.java:26) 
    at com.dugin.rostislav.modules.HandlingModule.configure(HandlingModule.java:32) 

Мои модули:

1.

public class HandlingModule extends AbstractModule { 
    private static final HandlingModule module = new HandlingModule(); 

    private HandlingModule() { 
     //Closed constructor 
    } 

    public static HandlingModule getInstance() { 
     return module; 
    } 

    @Override 
    protected void configure() { 
     bind(MainWindowPresenter.class).to(MainWindowPresenterImpl.class).in(Singleton.class); 
     bind(ImageCreatePresenter.class).to(ImageCreatePresenterImpl.class).in(Singleton.class); 

     bind(ImageCreater.class).to(ImageCreaterImpl.class).in(Singleton.class); 

     bind(ImageCreateView.class).to(ImageCreateViewImpl.class).in(Singleton.class); 
     bind(MainView.class).to(MainViewImpl.class).in(Singleton.class); 
    } 
} 

2.

public final class StorageModule extends AbstractModule { 
    private final static StorageModule module = new StorageModule(); 

    private TypeListener storageHelperListener = new TypeListener() { 
     @Override 
     public <I> void hear(final TypeLiteral<I> typeLiteral, TypeEncounter<I> typeEncounter) { 
      typeEncounter.register(new InjectionListener<I>() { 
       @Override 
       public void afterInjection(Object o) { 
        if (o instanceof StorageHelper) { 
         try { 
          ((StorageHelper) o).initDB(); 
         } catch (DBInitializationException e) { 
          throw new RuntimeException(e); 
         } 
        } 
       } 
      }); 
     } 
    }; 

    private StorageModule() { 
     //Closed constructor 
    } 

    public static StorageModule getInstance() { 
     return module; 
    } 

    @Override 
    protected void configure() { 
     bind(ImageDB.class).to(SQLiteDB.class).in(Singleton.class); 
     bind(StorageHelper.class).to(StorageHelperImpl.class).in(Singleton.class); 
     bind(ImagesHelper.class).to(ImagesHelperImpl.class).in(Singleton.class); 

     bind(String.class) 
       .annotatedWith(Names.named(StorageModuleConst.DB_FOLDER_PATH)) 
       .toProvider(Providers.of(StorageConst.OSLOADER_DATA_FOLDER)); 
     bind(String.class) 
       .annotatedWith(Names.named(StorageModuleConst.IMAGES_FOLDER_PATH)) 
       .toProvider(Providers.of(StorageConst.OSLOADER_IMAGES_FOLDER)); 

     bindListener(Matchers.any(), storageHelperListener); 
    } 
} 

Не мой класс существует!


Почему я принимаю ошибку и как она исправляется?


StorageHelperImpl конструктор:

@Inject 
    public StorageHelperImpl(@NonNull ImageDB database, @NonNull ImagesHelper imagesHelper) { 
     this.database = database; 
     this.imagesHelper = imagesHelper; 
    } 
+0

Пожалуйста, покажите конструктор (или как вы впрыснуть) 'StorageHelperImpl'. –

+0

Кроме того, возможно ли, что это проблема с пакетом? Например, вы создаете два класса с одинаковым именем в двух разных пакетах? Я думаю здесь о 'StorageModule' и' StorageHelper'. Проверьте весь свой импорт. –

+0

@ OlivierGrégoire, нет ... У меня есть только один класс с каждым именем. Я обновляю вопрос. – bukashka101

ответ

2

Попробуйте использовать

Guice.createInjector(Modules.combine(HandlingModule.getInstance(), StorageModule.getInstance())); 
+0

Да! Это работает! – bukashka101

+0

@hunter Можете ли вы объяснить, что делает 'Modules.combine (...)' работать в этом случае? Я просто ошеломлен, и я не понимаю! (Также рад, что это помогло bukashka101.) –

 Смежные вопросы

  • Нет связанных вопросов^_^