3

这是Spring Roo 1.1 制造工厂的方式,它返回 GWT 活动(是的,Spring 框架)

 public Activity getActivity(ProxyPlace place) {
    switch (place.getOperation()) {
      case DETAILS:
        return new EmployeeDetailsActivity((EntityProxyId<EmployeeProxy>)place.getProxyId(), requests, 
          placeController, ScaffoldApp.isMobile() ? EmployeeMobileDetailsView.instance() : EmployeeDetailsView.instance());

      case EDIT:
        return makeEditActivity(place);

      case CREATE:
        return makeCreateActivity();
    }

    throw new IllegalArgumentException("Unknown operation "
        + place.getOperation());
  }

在我看来,如果我们使用带有常量的开关盒来制造工厂,我们就像回到了百年前。现在这是官方自动生成的带有 GWT / GAE 集成的 Spring roo 1.1,我不骗你

我只能假设这是一些高管空洞的公告,因为这绝对不是春天

似乎 VMWare 和 Google 的速度太快了,以至于没有完全完成它,不是吗?

我是否遗漏了一些东西,或者这是半生不熟的,到目前为止还不是 Spring + GWT MVP 应该工作的方式?

你有更好的例子来说明 Spring、GWT(2.1 MVP 方法)和 GAE 应该如何连接吗?我不想做所有这样的管理历史和活动的管道。(没有注释?国际奥委会?)

我也不愿意重新发明轮子并编写自己的 Spring 增强功能只是为了发现其他人也这样做,或者更糟的是,发现 SpringSource 和 Google 将很快发布 roo 1.2 并使其正确

4

1 回答 1

2

我不怎么用 Roo,所以只能猜测。您引用的代码基本上类似于“GWT MVP Development with Activities and Places”文档页面中示例应用程序中的相应部分(注意:我没有插入注释,它们来自示例代码)

public class AppActivityMapper implements ActivityMapper {
...

 /**
  * Map each Place to its corresponding Activity. This would be a great use
  * for GIN.
  */
 @Override
 public Activity getActivity(Place place) {
    // This is begging for GIN
    if (place instanceof HelloPlace)
        return new HelloActivity((HelloPlace) place, clientFactory);
    else if (place instanceof GoodbyePlace)
        return new GoodbyeActivity((GoodbyePlace) place, clientFactory);

    return null;
 }
}

如果使用“switch + getOperation()”或“if + instanceof”,这并不重要。问题是,Activity 是使用new运算符构建的。这与依赖注入基础知识相冲突。

因此,与 DI 相关的基本操作是将工厂注入到 ActivityMapper 中,每种类型的 Place 都有一个:

 public Activity getActivity(Place place) {
    if (place instanceof HelloPlace)
        return helloActivityFactory.build((HelloPlace) place);
    else if (place instanceof GoodbyePlace)
        return goodbyeActivityFactory.build((GoodbyePlace) place);

    return null;
 }

这仍然具有开关特性。那是因为必须在地方和活动之间映射一些东西(唯一的选择是将活动工厂注入每个地方)。您可以像这样使映射可配置:

 Map<String, ActivityFactory> activityMap; /* injected */

 public Activity getActivity(Place place) {
    ActivityFactory factory = activityMap.get(place.getOperation());
    if (factory != null)
        return factory.build(place);

    return null;
 }

...如果可以定义一个通用的 ActivityFactory 接口,它可以使用公共参数(例如,在我的草稿中,build()只会使用place作为参数)。

现在这是我的猜测(只是猜测!),为什么 Roo 生成的代码中没有这样的内容:“GWT MVP Development with Activities and Places”文章是“Large scale application development and MVP”的后续文章,它展示了没有 DI 的 MVP,并承诺在未来提供一篇“使用 Gin 减少代码并促进测试”的文章。它仍然不存在,并且示例代码尚未更新以集成依赖注入。我假设 Roo 生成的代码在某种程度上基于那篇文章,因为它是该主题的参考。

于 2011-02-17T12:02:20.557 回答