可以将DTO的接口传递给DAO吗

Posted

技术标签:

【中文标题】可以将DTO的接口传递给DAO吗【英文标题】:Is it ok to pass interface of DTO to DAO 【发布时间】:2015-02-09 05:06:11 【问题描述】:

这是关于将DTO的接口传递给DAO。

例如我有以下代码

public interface User 
  String getName();


public class SimpleUser implements User 
  protected String name;

  public SimpleUser(String name) 
    this.name = name;
  

  @Override
  public String getName() 
    return name;
      


// Mapped by Hibernate
public class PersistentUser extends SimpleUser 

  private Long id;

  // Constructor

  // Getters for id and name

  // Setters for id and name

我正在使用通用 DAO。如果我使用界面 User 而不是 PersistentUser 创建 DAO 可以吗?

User user = new PersistentUser(name);
UserDao.create(user);

我在堆栈上阅读了很多主题,但没有弄清楚这种方法是否可行。请帮我。也许这很愚蠢,我只能解决问题。

关于分离豆子。 我这样做是因为我想通过 API 模块共享一些类,这些类可以在外部用于创建实体并将它们传递给我的应用程序。因为它们使用我开发的接口,所以我可以将它们传递给我的 DAO 进行持久化。

【问题讨论】:

为什么将 DTO 用作接口而不是直接类? 因为当我想以最小的更改存储外部实体时,它会很有用。例如,某人可以拥有自己的用户实现,并且只传递给我的接口。 我仍然不明白你的确切目的。编程的一个原则是 YAGNI:你不需要它。如果您不确定这是否有用,或者它是否可以支持未计划且可能还没有必要实施的未来更改,请不要这样做。再说一次,我仍然不明白您将接口用作 DTO。使用 DTO 的直接类在您的层之间进行基本通信,对特定情况使用接口(我目前在您的问题描述中找不到)。 好吧,也许你是对的。如果我想隐藏从 DAO 返回的实体的 setter 方法呢? 如果你不打算在 DAO 调用者中使用 setter,那么就不要在那里调用它们。我仍然没有找到为 getter 创建接口的好点。 【参考方案1】:

总的来说,我会说没问题,但有一些隐藏的问题。开发人员可以将对象向下转换或通过不应访问的 toString 方法访问某些状态。如果您不小心,可能会发生在不应序列化的 Web 服务中将状态序列化为 JSON/XML 的情况。名单还在继续。

我为那个用例创建了Blaze-Persistence Entity Views。您基本上将 JPA 实体的 DTO 定义为接口并将它们应用于查询。它支持映射嵌套 DTO、集合等,基本上是您所期望的一切,最重要的是,它会提高您的查询性能,因为它会生成查询,只获取 DTO 实际需要的数据。

您示例的实体视图可能如下所示

@EntityView(PersistentUser.class)
interface User 
  String getName();

查询可能如下所示

List<User> dtos = entityViewManager.applySetting(
  EntityViewSetting.create(User.class),
  criteriaBuilderFactory.create(em, PersistentUser.class)
).getResultList();

【讨论】:

以上是关于可以将DTO的接口传递给DAO吗的主要内容,如果未能解决你的问题,请参考以下文章

可以将可变数量的参数传递给函数吗?

我们可以将参数传递给 dart 中的引用方法吗?

我可以将类型作为参数传递给这个函数吗?

我可以绕过将 self 对象传递给 python 类方法吗?

我可以/应该将 Connection 对象传递给函数吗?

在scala中我可以将重复的参数传递给其他方法吗?