2015-12-07 6 views
1

Я довольно новичок в Guice, и я немного застрял в данный момент.Guice multibinding-экземпляры получают разные зависимости-экземпляры

Я занимаюсь разработкой бэкэнда для небольшой игры на Java. Я хочу, чтобы динамически инъекционные системы игры с Guice и я использую MultiBinding для этого:

private class InstanceModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(GameInstance.class).to(GameInstanceImplementation.class); 
     bind(EntityManager.class).to(EntityManagerImplementation.class); 
     bind(EventBus.class).to(EventBusImplementation.class); 
     bind(MessageBroker.class).toInstance(broker); 

     Multibinder<GameSystem> systemBinder = Multibinder.newSetBinder(binder(), GameSystem.class); 

     for (Class<? extends GameSystem> systemClass : systemsConfig) { 
      systemBinder.addBinding().to(systemClass); 
     } 
    } 
} 

systemsConfig просто Список классов GameSystem с я хочу, чтобы игра загрузки.

В моей GameInstanceImplementation.class я впрыснуть использованную GameSystems так:

@Inject 
public void setSystems(Set<IPMSystem> systems) { 
    this.systems = systems; 
} 

И я получаю GameInstance так:

GameInstance instance = injector.getInstance(GameInstance.class); 

Я делаю это так, потому что каждый GameSystem имеет разные зависимых, некоторые просто нуждаются в EntityManager, некоторые нуждаются в EventBus и так далее.

Теперь кажется, что каждый GameSystem имеет разные EventBus, EntityManager и т. Д., Поэтому они, конечно, не могут общаться друг с другом.

Я ожидал, что каждый GameSystem получает одинаковые экземпляры связанных зависимостей.

Что мне здесь не хватает?

Спасибо заранее, Froschfanatika

ответ

1

По умолчанию Guice создает новый экземпляр каждых зависимости каждый раз, когда это создание объекта. Если вы хотите изменить это поведение и получить некоторые зависимости, разделяемые между объектами, вам нужно поместить эти зависимости в другую область.

Таким образом, вместо того, чтобы ...

bind(EventBus.class).to(EventBusImplementation.class); 

вы могли бы сделать что-то вроде ...

bind(EventBus.class).to(EventBusImplementation.class) 
        .in(Singleton.class); 

тогда Guice будет только каждый создать один экземпляр реализации EventBus, и ничего, что нужно EventBus в качестве зависимости будет дан этот отдельный экземпляр.

Следует отметить, что поведение Гиса в этом отношении отличается от поведения Весны. Spring DI обрабатывает все бобы как одиночные по умолчанию. Значение по умолчанию Guice больше похоже на то, что Spring называет «прототипом».

https://github.com/google/guice/wiki/Scopes

+0

Спасибо, что сделал трюк. Эти синглтоны не являются настоящими синглтонами, верно? Если все ссылки удалены (включая инжектор), они будут собирать мусор? – Froschfanatika

+0

Да, они не синглтон в смысле шаблона GoF Singleton. Это область действия, характерная для каждого инжектора Guice - только один экземпляр существует на инжектор, поэтому они получают GC'd с инжектором. – sisyphus

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