我最近在我们的代码中遇到了这种模式(?)并想知道它是如何有用的,如果有的话。我们有一个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是有道理的,界面是有意义的,但不是在一起。
答案 0 :(得分:3)
在基于事务的环境中,DTO用于从基础数据库会话中拆分数据库实体。
这些会话通常不可用,大多数实体都是由懒惰加载成员集合的代理组成。因此,如果您要访问代理实体上的集合属性,则代理会在此时加载集合,是否存在数据库事务。因此,当没有活动事务时,实体成员的访问可能会产生错误。
当您将实体转发到尝试访问成员的视图时,会发生这种情况。由于事务处理通常在服务层中定义,因此视图/控制器中没有活动事务。
要绕过这个问题,有不同的方法:
答案 1 :(得分:3)
我不明白为什么接口和DTO不会一起工作。
考虑一个从DTO创建域对象的工厂/汇编程序。您可以使用策略配置工厂,以便能够根据给定的DTO类型创建域对象的特定实现。理想情况下,DTO将在此处键入接口。 (这也是相反的方向)。
我并不是说你应该把每个DTO放在一个接口之后,但就像使用域对象一样,肯定会有这样做的好处。