【问题标题】:Implementing MVC observer pattern with google guice使用 google guice 实现 MVC 观察者模式
【发布时间】:2014-02-23 18:39:12
【问题描述】:

我对mvc有很好的了解。我仍然不确定的是如何正确使用 google guice 来注入依赖项。这是我的代码的一部分:

protected void configure() {
    bind(IAppController.class).to(AppController.class);
    bind(IAppView.class).to(AppView.class);
    bind(IAppModel.class).to(AppModel.class);
}

现在,我不确定如何正确注入依赖项。我想请教您对处理此问题的最佳方法的意见。我将它们注入这样的构造函数中

public class AppController implements IAppController {

private IAppView appView;
private IAppModel appModel;

@Inject
public AppController(IAppView appView, IAppModel appModel){
    this.appModel = appModel;
    this.appView = appView;
}

}

现在上面的例子有效,但增加了另一个问题。我怎样才能给模型一个视图的实例?我的视图是观察者,我需要将控制器中注入视图的相同实例注入模型中。我想出的另一种方法是简单地使用注入器来获取模型、视图、控制器的实例并在那里组装它们?如:

public static void main(String[] args){
    Injector injector = Guice.createInjector(new AppBootstrapLoader());
    IAppController controller = injector.getInstance(IAppController.class);
    IAppView view =...
    IAppModel model =....
    controller.setModel(model);
    controller.setView(view);
    model.addObserver(view);
}

我的最后一种方法是将模型视图和控制器作为单例,这样我可以确保所有注入的实例都是相同的。我对 guice 还是新手,我仍然无法理解它如何处理依赖关系。我也想干净地做到这一点,因此我正在研究。我想听听您对这种方式的经验和意见。谢谢你。

【问题讨论】:

    标签: java model-view-controller guice observer-pattern


    【解决方案1】:

    我认为您正在寻找的是“方法注入”。请注意,如果给定的依赖项不存在,则绑定过程将失败。

    方法注入:

    @Inject
    public void setView(View view) {
        this.view = view;
    }
    

    您也可以使用字段注入。但我并不是真的喜欢它,因为如果你只能通过反射设置依赖关系,它会使编写单元测试变得更加困难。

    字段注入:

    @Inject
    private View view
    

    来源:injections

    【讨论】:

    • 我已经读到了。现在我找不到足够的资源来确保当我创建模型视图和控制器的实例时它们能够正确组装。我的意思是模型会收到与控制器收到的相同的视图实例。抱歉刚开始guice
    • 听起来您想将您的实例声明为单例。这可以通过您的模块(在构建绑定时)或使用 @Singleton 注释来完成。查看范围:code.google.com/p/google-guice/wiki/Scopes
    • 如果我不添加@Singleton 注释,guice 将如何处理依赖注入?
    • 每次请求绑定时都会创建一个新实例。
    • 它是正确的(因为它有效),但从 DI 的角度来看,我不喜欢它。您不应该直接设置依赖项,至少不在应用程序的根目录中。
    猜你喜欢
    • 2015-02-12
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多