DTO和接口

时间:2010-01-22 02:29:12

标签: java flex architecture dto

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

的Java


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

public class SomeDTO implements ISomeDTO
{
..
}


的Actionscript


public interface ISomeDTO {
       var id:Integer;
}

public class SomeDTO implements ISomeDTO
{
..
}


DTO上的界面会让您获得什么?这些是轻量级对象,逻辑绝对为零。 DTO是有道理的,界面是有意义的,但不是在一起。

2 个答案:

答案 0 :(得分:3)

在基于事务的环境中,DTO用于从基础数据库会话中拆分数据库实体。

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

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

要绕过这个问题,有不同的方法:

  • 保持会话开放,例如一个Filter机制(Spring的OpenSessionInViewFilter),虽然严格来说这是一个反模式
  • 让您的DAO返回一个数据传输对象,其中填充了已初始化的所需成员
希望这会有所帮助。

答案 1 :(得分:3)

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

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

我并不是说你应该把每个DTO放在一个接口之后,但就像使用域对象一样,肯定会有这样做的好处。