10

我希望重新定义或更新模块中的一些绑定,这些绑定又被注入器使用。我意识到模块是不可变的,一旦绑定被吸收和注入,它的定义就不能改变所有实际目的。

我想添加/更改/删除绑定,同时保持单例已经存在于注入器中。更改是一个简单的案例,因为可以通过使用 Provider 来实现此效果。但是动态添加或删除 Key(绑定定义)有点棘手。

如果这应该或可以实际完成的任何想法。

我认为最好的方法是每次添加/删除绑定时重新创建一个注入器,将定义从原始复制到新的,任何现有的单例都将由 toInstance 而不是实现类型等重新定义。

4

1 回答 1

10

可以使用子注射器来完成此操作,但需要一些设置。子注射器将防止长期绑定依赖于短期绑定。这是一个例子:

class ForeverModule extends AbstractModule {
  ...
}

class TemporaryModule extends AbstractModule {
  ...
}

class Main {
    public static void main(String... args) {
        Injector foreverInjector = Guice.createInjector(new ForeverModule());

        Injector injector = foreverInjector.createChildInjector(
                new TemporaryModule());
        /*
         * Do stuff with the injector as you would normally. When you
         * get bored of that injector, create a replacement injector
         * as a child of the long-lived injector.
         */
    }
}

只要该模块存在,forever 模块中的单例绑定就会持续存在。只要您使用相应的注入器,临时模块中的单例绑定就会持续存在。

警告:默认情况下,将在顶级注入器中创建即时绑定。如果您需要短期绑定,则需要在子注入器模块中绑定接口和实现。看起来像这样:

public void configure() {
    bind(Foo.class).to(RealFoo.class);
    bind(RealFoo.class);
}
于 2010-06-20T07:23:47.900 回答