GWT RPC:DTO vs. DAO?

20 浏览
0 Comments

GWT RPC:DTO vs. DAO?

我大约一周前开始学习GWT,以下是我无法确定答案的问题。

以下是服务器端的代码:

// 业务对象 - 包含逻辑

interface Article {

String getTitle(); // 延迟加载

void setTitle();

String getText(); // 延迟加载

void setText();

Set getComments(); // 延迟加载

}

// 还有逻辑

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);

...这里的评论也有类似的逻辑...

}

第二种方式是使用DAO:

class ArticleDAO implements Serializable {

private transitional MyRPC rpc;

private int articleId; // 只有这个可序列化

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

public String getTitle() {

// 我知道在实际情况下会需要更多代码

return rpc.getArticleTitle(articleId);

}

...

}

我喜欢第一种方式,因为它很简单。我喜欢第二种方式,因为它相对复杂。我应该选择哪一种方式来使代码更易于理解和维护?

0
0 Comments

GWT RPC:DTO vs. DAO?

在GWT应用程序中,我们经常会遇到DTO(Data Transfer Object)和DAO(Data Access Object)之间的问题。DTO是用于定义数据的对象,而DAO是用于确定系统中的数据访问方法的对象。

在上述内容中,第一种方法被认为是一种比较好的方式。它使用了一个名为MyRPCRepository的对象作为DAO(数据访问对象)。这个方法符合DAO/DTO的设计模式,将数据的访问和定义分开了。

然而,第二种方法被认为是有问题的。它是一种奇怪的服务,允许您访问一些数据片段,但同时保留了一些状态(通常情况下,我们希望DAO是无状态的)。

因此,大多数人选择了第一种方法。但是,建议将MyRPCRepository重命名为ArticleDAO,并为其他数据对象创建类似的DAO。

我们可以得出结论:在GWT应用程序中,使用DAO模式和DTO模式是一种较好的做法。通过将数据的访问和定义分离,可以提高代码的可维护性和可扩展性。同时,建议使用有意义的命名来使代码更易读和理解。

// DTO

public class ArticleDTO {

private String title;

private String content;

// getters and setters

}

// DAO

public interface ArticleDAO {

public void save(ArticleDTO article);

public ArticleDTO findById(int id);

public List findAll();

}

// Implementation of ArticleDAO

public class ArticleDAOImpl implements ArticleDAO {

public void save(ArticleDTO article) {

// save the article to database

}

public ArticleDTO findById(int id) {

// find the article by id in database

return null;

}

public List findAll() {

// find all articles in database

return null;

}

}

// Usage of ArticleDAO

public class ArticleService {

private ArticleDAO articleDAO;

public ArticleService() {

articleDAO = new ArticleDAOImpl();

}

public void saveArticle(ArticleDTO article) {

articleDAO.save(article);

}

public ArticleDTO getArticleById(int id) {

return articleDAO.findById(id);

}

public List getAllArticles() {

return articleDAO.findAll();

}

}

0
0 Comments

GWT RPC: DTO vs. DAO?

在使用GWT RPC时,开发人员需要考虑如何使用解决方案。假设在客户端有一种表格UI,其中始终显示articelId、title和text(知道你描述的是一种“在线论坛”,可以假设你不显示text,但假设我不知道)。现在,使用DTO,你可以简单地将一批(一页?)对象传输到客户端。这意味着传输是一次性完成的,并且只有一个来自客户端的请求来完成。

对于你的DAO方法(在这种情况下,我不会称之为DAO,而是“Service”),你可能仍然会在一个请求/响应中向客户端发送一批对象,但从客户端返回的是一系列小请求以显示title和text。

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

另一方面,如果只有少数用户使用系统(几十或几百个),我会使用最容易开发或维护的方法。

0
0 Comments

GWT RPC: DTO vs. DAO?

在我参与的项目中,人们对于解决这类问题的最佳方法似乎存在很大的分歧。这两种方法都有其优缺点。DTO方法现在由GWT在一个名为RequestFactory的API中提供支持,并被宣传为“标准”GWT RPC用法(即DAO方法)的一种替代方案。使用DTO方法可以获得性能和与GWT的数据绑定框架的集成,但需要付出维护DTO的成本。我认为这是一个很好的权衡,但对于小项目来说可能有点过度设计。

在传统的GWT RPC用法中,我们使用DAO(数据访问对象)来处理与服务器的通信。DAO对象负责将数据从服务器传输到客户端,然后在客户端上执行必要的操作。这种方法需要在服务器和客户端之间进行数据转换,因为服务器上的数据可能与客户端所需的数据结构不同。这种转换可能会导致额外的开销,并且在代码中需要编写大量的转换逻辑。

而使用DTO方法,我们可以直接在服务器和客户端之间传输数据对象,而无需进行额外的转换。DTO对象包含了客户端所需的所有数据,并且可以与GWT的数据绑定框架集成,使得在客户端上更加方便地操作和展示数据。此外,DTO方法还可以提高性能,因为它减少了数据转换的开销。

然而,使用DTO方法也存在一些问题。首先,它需要维护大量的DTO对象,这可能会增加开发和维护的工作量。其次,DTO方法可能不适用于小型项目,因为它可能过于复杂,不值得投入大量时间和精力来实现和维护DTO对象。因此,在小型项目中,使用DAO方法可能更为简单和实用。

总结起来,DTO方法与DAO方法在处理GWT RPC的数据传输方面各有优缺点。DTO方法通过减少数据转换的开销和提高性能,提供了更方便的数据操作和展示方式,但需要付出维护DTO对象的成本。而DAO方法相对简单,适用于小型项目,但需要进行数据转换,可能导致额外的开销。在选择使用哪种方法时,需要根据项目的规模和需求来权衡各自的优劣,选择最适合的方法来处理GWT RPC的数据传输。

0