GWT RPC:DTO 与 DAO?

Posted

技术标签:

【中文标题】GWT RPC:DTO 与 DAO?【英文标题】:GWT RPC: DTO vs. DAO? 【发布时间】:2011-11-25 17:55:05 【问题描述】:

我大约一周前开始学习 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);
  
  ...

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

【问题讨论】:

我知道这不是您的问题,因此发表评论。 DTO 是反模式,而 GWT RPC 是非常基本的(我知道这会让很多人感到不安,但事实是痛苦的)。您需要将 GWT 与 restful 后端一起使用,或者使用 gwt_pltform code.google.com/p/gwt-platform 之类的调度程序框架 @Shahzeb,如果您认为 DTO 是一种反模式,一些参考资料或理由会很好。还是您仅指 GWT? @AngelO'Sphere jroller.com/raghukodali/entry/dto_an_antipattern_in_ejb 和 ***.com/questions/1440952/… @Shahzeb,抱歉,jroller 文章写得不好,也不是结论性的。每个人都在使用 DTO 将“显示”信息从业务层传输到“显示和操作”层,尤其是在通过 Web 传输的情况下。将系统边界处的外部数据转换为内部数据是大型系统设计的主要原则。 “外部”数据是 DTO。这意味着当我的数据在浏览器中创建时,对于我的系统来说,该浏览器是外部的。我收到的数据,DTO,被转换成 BO(EJB,POJO,等等)。 如果您将内部数据传输到外部系统,则完全相同。您将其转换为适合外部系统的 DTO,然后剥离所有内部数据,例如主键等。做一些不同的事情是完全错误的,从长远来看将导致灾难。顺便说一句:您是否费心阅读您自己的 SO 问题的答案?结论是一样的;D 【参考方案1】:

在我参与过的项目中,人们似乎对解决此类问题的最佳方法有很大不同的看法。两者都有优点和缺点。 DTO 方法现在在称为RequestFactory 的 API 中由 GWT 支持,并且被宣传为“标准”GWT RPC 使用(您的 DAO 方法)的替代方案。您可以获得与 GWT 的数据绑定框架的性能和集成,以及维护 DTO 的成本。我认为这是一个很好的权衡,但对于小型项目来说,这可能是矫枉过正。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于GWT RPC:DTO 与 DAO?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 GWT EntityProxy 与 RPC 调用一起使用?

GWT-RPC 序列化的 ImmutableCollection 声明

GWT JPA - 无法反序列化响应

GWT RPC 未生成正确的 gwt.rpc 文件

GWT:更换与异步的RPC阻塞调用

什么时候应该使用 RequestFactory 与 GWT-RPC?