【发布时间】: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?
-
@Shahzeb,抱歉,jroller 文章写得不好,也不是结论性的。每个人都在使用 DTO 将“显示”信息从业务层传输到“显示和操作”层,尤其是在通过 Web 传输的情况下。将系统边界处的外部数据转换为内部数据是大型系统设计的主要原则。 “外部”数据是 DTO。这意味着当我的数据在浏览器中创建时,对于我的系统来说,该浏览器是外部的。我收到的数据,DTO,被转换成 BO(EJB,POJO,等等)。
-
如果您将内部数据传输到外部系统,则完全相同。您将其转换为适合外部系统的 DTO,然后剥离所有内部数据,例如主键等。做一些不同的事情是完全错误的,从长远来看将导致灾难。顺便说一句:您是否费心阅读您自己的 SO 问题的答案?结论是一样的;D