5

我最近在我们的代码中遇到了这种模式(?),想知道它有什么用处,如果有的话。我们有一个使用 BlazeDS 的 Spring 应用程序和一个 Flex 前端。我们决定在 DTO 上使用接口,如下所示:

爪哇


public interface ISomeDTO {
       Integer setId();
       void getId(Integer i);
}

public class SomeDTO implements ISomeDTO
{
..
}


动作脚本


public interface ISomeDTO {
       var id:Integer;
}

public class SomeDTO implements ISomeDTO
{
..
}


DTO 上的接口能为您带来什么?这些是具有绝对零逻辑的轻量级对象。DTO 有意义,接口有意义,但不能一起使用。

4

2 回答 2

3

在基于事务的环境中,DTO 用于将数据库实体与底层数据库会话分开。

这些会话通常不可用,并且大多数实体由延迟加载成员集合的代理组成。因此,如果您要访问代理实体上的集合属性,则代理会在此时加载集合,无论是否存在数据库事务。因此,当没有活动事务时,实体成员的访问可能会产生故障。

当您将实体转发到试图访问成员的视图时,就会发生这种情况。由于事务处理通常在服务层中定义,因此视图/控制器中没有活动事务。

为了解决这个问题,有不同的方法:

  • 通过例如过滤器机制(Spring 的 OpenSessionInViewFilter)保持会话打开,尽管严格来说这是一种反模式
  • 让您的 DAO 返回一个数据传输对象,其中填充了已初始化的所需成员

希望这有帮助。

于 2010-01-22T02:44:42.480 回答
3

我不明白为什么接口和 DTO 不能一起工作。

考虑一个从 DTO 创建域对象的工厂/汇编器。您可以使用策略配置工厂,以便它能够根据给定的 DTO 类型创建域对象的特定实现。理想情况下,DTO 将被键入到此处的界面。(这也适用于相反的方向)。

我并不是说您应该将每个 DTO 放在接口后面,但就像域对象一样,在某些情况下这样做肯定是有益的。

于 2010-01-22T09:14:42.063 回答