GWT轧棉机现场水平注入

GWT轧棉机现场水平注入,gwt,dependency-injection,gwt-gin,Gwt,Dependency Injection,Gwt Gin,我们正在使用GIN-in-out-GWT项目进行评估,并通过构造函数参数使用典型注入获得了良好的结果。我们遇到的困难是现场级注入。字段最终总是为空。有没有人有一个好的例子来说明如何正确地使用杜松子酒实现现场水平注射 更新: 下面是一些与我们类似的示例代码: 公共类MVP实现入口点{ 公共静态最终HandlerManager事件\ u总线=新HandlerManager(null); 私有最终MVPInjector _injector=GWT.create(MVPInjector.class);

我们正在使用GIN-in-out-GWT项目进行评估,并通过构造函数参数使用典型注入获得了良好的结果。我们遇到的困难是现场级注入。字段最终总是为空。有没有人有一个好的例子来说明如何正确地使用杜松子酒实现现场水平注射

更新:

下面是一些与我们类似的示例代码:

公共类MVP实现入口点{
公共静态最终HandlerManager事件\ u总线=新HandlerManager(null);
私有最终MVPInjector _injector=GWT.create(MVPInjector.class);
moduleload()上的公共void{
//设置模块的布局
RootLayoutPanel.get().add(主面板);
//初始化演示者
ListPresenter ListPresenter=_injector.ListPresenter();
DetailPresenter DetailPresenter=\u injector.DetailPresenter();
listPresenter.go(listContainer);
detailPresenter.go(detailContainer);
//模拟来自RPC调用的数据
EVENT_BUS.firevent(新的DataReadyEvent(getData());
}
}
公共类列表演示者{
私人最终HandlerManager_eventBus;
私有最终映射_myRecords=newhashmap();
私有最终显示_视图;
@注入
公共列表演示器(显示argView、HandlerManager argEventBus){
_eventBus=argEventBus;
_视图=argView;
}
公共void go(HasWidgets argContainer){
argContainer.clear();
argContainer.add(_view.asWidget());
}
公共界面显示{
公共小部件asWidget();
公共空间清除();
公共SingleSelectionModel getSelectionModel();
公共无效设置数据(列表argData);
}
}
公共类演示者{
私人最终HandlerManager_eventBus;
私有最终显示_视图;
私家水果(myRecord);;
@注入
私有ImagePresenterFactory\u ImagePresenterFactory;
@注入
私人测试演示者(TestPresenter);;
@注入
公共详细信息演示者(显示argView、HandlerManager argEventBus){
_视图=argView;
_eventBus=argEventBus;
}
公共void go(HasWidgets argContainer){
argContainer.clear();
argContainer.add(_view.asWidget());
if(_testPresenter!=null){
_testPresenter.go();
}
}
公共界面显示{
公共小部件asWidget();
public HasText getDescriptionControl();
public HasClickHandlers getImageControl();
public HasText getNameControl();
public HasClickHandlers getSaveControl();
public void setEnabledControls(布尔值argEnabled);
}
}
公共类TestPresenter{
@注入
HandlerManager\u事件总线;
公共TestPresenter(){}
公开作废go(){
如果(_eventBus!=null){
_eventBus.toString();
}
否则{
//未注入事件总线
}
}
}
@GIN模块(MVPModule.class)
公共接口MVPInjector扩展了Ginjector{
DetailPresenter DetailPresenter();
ListPresenter ListPresenter();
}
公共类MVPModule扩展了AbstractGinModule{
@提供
@独生子女
公共HandlerManager getEventBus(){
返回MVP.EVENT_总线;
}
@提供
公共TestPresenter getTestPresenter(){
返回新的TestPresenter();
}
@凌驾
受保护的void configure(){
绑定(ListPresenter.Display.class).to(ListView.class);
绑定(DetailPresenter.Display.class).to(DetailView.class);
绑定(ImagePresenter.Display.class).to(ImagePopup.class);
安装(新的GinFactoryModuleBuilder().build(ImagePresenterFactory.class));
}
公共接口ImagePresenterFactory{
公共ImagePresenter CreateMagePresenter(ImageResource argImage);
}
}

在上面的代码中,我删除了大部分不涉及GIN的代码。DetailPresenter所需的TestPresenter已成功注入,但TestPresenter所需的HandlerManager始终为空。如您所见,注入的HandlerManager未在构造函数中使用。

更新,查看示例代码:

@Provides
public TestPresenter getTestPresenter() {
  return new TestPresenter();
}
因为是您自己创建的,所以它假设您已经处理过任何注射。删除此方法,它将调用默认构造函数(如果需要,在那里注入),然后访问任何其他注入站点

您可能遇到的另一个问题是:存在多个HandlerManager impl,请确保对HandlerManager的所有引用都使用相同的包


原始答复:

当构造函数运行时,它们将为null,但这是有意义的——当注入器还没有机会分配所有字段时,它们怎么可能是任何其他值。考虑一下这可能会如何运行(在这里表示为法律上的java,因为字段可能不是公开的):

当该字段有资格被分配时,您的构造函数已经运行

如果在运行另一个方法时该字段为null,请确保该方法不是由构造函数运行的,而是在注入完成其工作后运行的。其他可能为空的情况是
@Inject
带注释的setter


假设不存在这些情况(最简单的检查方法是设置断点,并确保注入器不在调用堆栈中),请确保该字段确实具有
@Inject
,并且它没有绑定到空实例。

并且不尝试从构造函数中访问其值?(显然,对象必须在其字段被注入之前构造)我在我的原始帖子中添加了一些示例代码,并澄清了我在哪里得到了意外的空值。更新后,请查看删除getTestPresenter的建议。如果你出于其他原因需要这种方法,那么它需要处理注射——这就是@Provides在你使用它时的意思;我误解了注释的目的。谢谢。如果我想注入类似于
CurrentUser
的内容,该怎么办?何时何地初始化此对象?在这种情况下,我会使用提供的
@吗?我需要/想要的是将
CurrentUser
注入我的
LoggedInGatekeeper
bu
InstanceToInject instance = new InstanceToInject(...);
instance.field = provideFieldValue();