一周前我开始学习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);
}
...
}
我喜欢第一个,因为它真的很愚蠢。我喜欢第二个,因为它非常有智慧。我应该选择哪一个来使代码更易于理解和维护?
答案 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),我会使用最容易开发或维护的方法。