我想创建以下简单的 MVP 架构:
查看类,即 vaadin 布局、组件、样式。非功能性的。 View 应该绑定(bind)到当前的 ViewScope/SessionScope,因此我使用 https://github.com/peholmst/vaadin4spring 的
@UIScope
演示者应该注入(inject) View ,在 View 组件上注册监听器,处理用户输入并委托(delegate)给模型服务
问题:当我将 View 注入(inject)演示者时, View 被重新创建,因此演示者和 View 不在同一范围内。所以绑定(bind)将不起作用。 我可以改变什么来实现上述设计?
@VaadinComponent
@UIScope
public class LoginView {
//form fields, buttons
}
@Controller
public class LoginPresenter implements ClickListener {
@Autowired
private LoginView view;
@PostConstruct
public void bind() {
view.getLoginButton().addClickListener(this);
}
@Override
public void buttonClick(ClickEvent event) {
//validate input and login
}
}
最佳答案
也许是这样的
public class LoginView {
@Autowired
public void initPresenter(LoginPresenter loginPresenter) {
loginPresenter.setLoginView(this);
loginPresenter.bind();
}
}
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class LoginPresenter {
private LoginView loginView;
public void bind() {
// ...
}
public LoginView getLoginView() {
return loginView;
}
public void setLoginView(LoginView loginView) {
this.loginView = loginView;
}
}
编辑
例如,您可以解耦添加配置接口(interface),但会增加一些复杂性
public interface View {
}
public interface Presenter {
void setView(View view);
void bind();
}
public interface ViewManager {
void configure(View view);
}
public class ViewSupport implements View {
@Autowired
private ViewManager viewManager;
@PostConstruct
public void init() {
viewManager.configure(this);
}
}
/**
* ViewManager that configure Presenters following
* the naming convention XXView->XXPresenter
*/
public class DefaultViewManager implements ViewManager {
@Autowired
private ApplicationContext applicationContext;
@Override
public void configure(View view) {
Presenter p = (Presenter) applicationContext.getBean(getPresenterName(view.getClass()));
p.setView(view);
p.bind();
}
protected String getPresenterName(Class<?> clazz) {
return StringUtils.uncapitalize(clazz.getSimpleName()).replace("View", "Presenter");
}
}
关于spring - 如何使用 Vaadin + Spring 创建 MVP 架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613029/