1

我的核心应用程序已完成。我能够成功加载模块,但我仍然无法正确使用 guice 在我的模块中注入依赖项。我的核心应用程序使用服务加载器加载模块,并使用 guice 的 AbstractModule 的安装方法安装它们。这是一个示例代码:(简化)

 @Override
protected void configure() {
    ServiceLoader<IModule> modules = ServiceLoader.load(IModule, ucl);
    for (IModule module : modules) {
        install(module);
    }

} 

每个模块都实现了 IModule 接口,该接口扩展了 guice 的 Module 接口。让我感到困惑的是,当不建议到处都有注入器时,我如何提供插件实例(例如视图实例)。我阅读了@Provides 注释,我认为这是一个可能的解决方案,但我面临的另一个问题是其中一些具有需要注入的依赖项。例如,我的 pluginview 注入了一个插件控制器的实例。鉴于这种情况,我不确定如何使用提供者接口。建议将不胜感激

public PlugIn implements IModule{
    @Override
    public void configure(Binder binder){
        binder.bind(View.class).to(PlugInView.class);
    }

    public View getView(){
        //Should return a view instance
        //Still unsure how to provide this
    }
}

public PlugInView extends View{

   @Inject
   private PlugInView(PlugInController controller){
   //Do stuff with controller
   }
}
4

1 回答 1

1

好吧,我终于发现了为什么我的方法行不通。在阅读之后,似乎为了让 guice 注入依赖项,guice 必须是实例化您的类的人。在我的方法中,我有一个迭代器,它懒惰地实例化服务加载器加载的模块。为了解决这个问题,我已经停止从我的核心应用程序安装模块。

@Override
protected void configure() {
    ServiceLoader<IModule> modules = ServiceLoader.load(IModule, ucl);
    bind()...//Configure core app bindings

    //Removed this part
    for (IModule module : modules) {
        install(module);
    }
    //Until here
} 

并让每个插件制作自己的注入器,以便调用自己的配置方法。这种方法似乎为每个模块提供了独立的注入器,在我看来这似乎是可以接受的,因为我希望每个模块都是独立的。我也喜欢这种方法如何让我的插件不再实现 Module 接口或扩展 AbstractModule 让他们自由选择是否使用 guice。

于 2014-02-03T00:34:20.093 回答