2010-01-22 82 views
5

我最近在我们的代码中运行了这个模式(?),并想知道它是如何有用的。我们有一个使用BlazeDS的Spring应用程序和一个Flex前端。会议决定,我们使用我们的DTO接口,就像这样: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是有意义的,接口是有意义的,但不是在一起。

回答

3

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

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

我不是说你应该把每个DTO放在一个接口后面,但是和域对象一样,肯定会有这样做的情况。

+2

他们在你的情况下,我可以看到为什么这将是有益的。这在我们的应用程序中是标准的,没有明显的原因(至少对我而言)。我的想法是在需要时使用界面,而不仅仅是因为。 – unscene 2010-01-24 00:33:57

3

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

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

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

要环游这个问题有不同的方法:

  • 保持会话通过例如开放一种过滤机制(Spring的的OpenSessionInViewFilter),但严格来说,这是一个反模式
  • 让你的DAO返回充满需要成员数据传输对象已经初始化

希望这有助于。

+1

当然,我理解这些观点。但为什么DTO上的界面对我来说没有意义? DTO的使用并不陌生,只是在这里包含一个接口。 – unscene 2010-01-22 02:53:51

+0

哦,sry完全误读了这些问题。迟到和所有。我不明白为什么我会在这里使用一个界面,对我来说没有意义:/ – fasseg 2010-01-22 02:56:01

+0

至少我不是唯一一个:P 谢谢你的答案。精心制作。 – unscene 2010-01-22 02:59:57