GWT RPC:DTO与DAO?

时间:2011-09-27 05:26:32

标签: java gwt dao dto gwt-rpc

一周前我开始学习GWT,这是我无法回答的问题。

这是服务器端:

// business object - has logic
interface Article {
  String getTitle(); // lazy
  void setTitle();
  String getText(); // lazy
  void setText();
  Set<Comment> getComments(); // lazy
}

// also has logic
interface Comment { ... }

我需要以某种方式创建一个GWT小部件来可视化Article。传递Article将不起作用,因为它不可序列化,而且它有一些BL。所以,有两种方式:

第一个是使用DTO,如:

class ArticleDTO implements Serializable {
  public int articleId;
  public String title;
  public String text;
}

class CommentDTO implements Serializable {
  public int commentId;
  public int articleId;
  public String commentText;
}

我必须在我的GWT RPC服务中实现存储库逻辑:

class MyRPCRepository ... {
  ArticleDTO getArticle(int id);
  void saveArticle(ArticleDTO article);
  void deleteArticle(ArticleDTO article);
  ...similar things for comments here...
}

第二种方法是使用DAO:

class ArticleDAO implements Serializable {
  private transitional MyRPC rpc;
  private int articleId; // only this one is serializable

  public ArticleDAO(MyRPC rpc, int articleId) { ... }

  public String getTitle() {
    // i know it would require more code in real
    return rpc.getArticleTitle(articleId);
  }
  ...
}

我喜欢第一个,因为它真的很愚蠢。我喜欢第二个,因为它非常有智慧。我应该选择哪一个来使代码更易于理解和维护?

3 个答案:

答案 0 :(得分:3)

在我参与过的项目中,人们似乎对他们对这类问题采取最佳方法的看法存在很大差异。两者都有利弊。现在,GWT在名为RequestFactory的API中支持DTO方法,并将其作为“标准”GWT RPC使用(您的DAO方法)的替代方案进行公告。您可以获得与GWT数据绑定框架的性能和集成,以及维护DTO的成本。我认为这是一个很好的权衡,但对于小型项目来说,这可能是过度的。

答案 1 :(得分:2)

通常,DAO是确定系统数据访问方法的对象,而DTO则定义DAO使用的数据。所以你的第一种方法非常好,但它实际上是DAO / DTO方法,MyRPCRepository实际上是DAO(数据访问对象)。

第二种方法对我来说很奇怪。它是某种服务,允许您访问某些数据,但它保留一些状态(通常您希望DAO成为无状态)。

所以我投票支持第一种方法,但是存储库可能应该被称为ArticleDAO,类似的DAO将用于其他数据对象。

答案 2 :(得分:1)

要问的问题是“你打算如何使用任何解决方案?”假设你在客户端有一种表UI,你总是在那里显示articelId,title和text(知道你正在描述一种“在线论坛”我可以假设你没有显示文本,但是让我假装我不知道那个)。现在,使用DTO,您只需将对象(一页?)的对象传输到客户端即可。这意味着传输在一个块中完成,并且客户端只有一个请求完成填充。 使用DAO方法(在这种情况下我不会将DAO称为“服务”),您仍然可以在一个请求/响应中向客户端发送一堆对象,但会显示一连串显示标题和文本的小请求来自客户。

所以要问的问题是:用户如何与您的系统进行交互?在您的具体示例中,我总是会传输“id”和“title”,并且只对文本使用第二个请求/ DAO approch。

再次OTOH,如果只有少数用户使用该系统(几十个或几个hundret),我会使用最容易开发或维护的方法。