【问题标题】:When does an object qualify as a DTO?什么时候对象有资格成为 DTO?
【发布时间】:2010-09-02 15:07:23
【问题描述】:

DTO(数据传输对象) 是用于在应用程序的多个子系统之间传输信息的对象,通常由网络或进程边界分隔。这是我的理解。

但是,从 Java 的角度来看,子系统/模块是否必须位于不同的 JVM 实例上才能使它们在它们之间使用的对象才有资格成为 DTO? (我相信,在子系统之间的模块化和功能方面,架构上的显着划分就足够了。)怎么说?

此外,考虑到架构的同一层/层中多个模块交换的对象,这些对象不符合 DTO 的条件吗?分层是强制性的吗?

提前致谢。

问候,

纳根德拉 U M

【问题讨论】:

    标签: jvm design-patterns dto


    【解决方案1】:

    因为在层之间传输对象需要某种序列化,所以它被认为是 DTO。在层之间传输对象通常是通过使用域实体完成的,因此不需要序列化。

    因此,您的 DTO 通常不具有仅用于保存数据的行为属性。

    一点提示:当您的实体没有行为,只有数据时,DTO 经常被误认为是贫血的对象。或者当对象仅用于将数据传入和传出方法或类然后消失时的 poltergeist 对象。

    例如,有时您的数据持久性机制要求您实现或继承您不想耦合到域层的接口或类,因此您创建继承或实现接口/类的对象并将数据传输到这些类为了坚持。

    class Person{
    public string Name {get;set;}
    public int Age {get;set;}
    
    public void Validate(){}
    public void DoSomething(){}
    }
    
    
    
    public class PersonDTO : TableServiceContext
    {
    public const string ContactTableName = "PersonTable"
    
    public string Name {get;set;}
    public int Age {get;set;}
    
    }
    

    你通常会有一个类来组装和拆卸这些对象。

    【讨论】:

    • 感谢您的回答。美好的。我同意 DTO 主要只有数据,很少或没有行为。但是,将 DTO 称为 DTO 是否必须进行序列化?只要我们能够区分子系统之间的界限,并通过不可序列化的对象(假设子系统共享相同的JVM)在它们之间建立契约来交换数据,我们还不能将这些对象称为DTO吗? (至少原则上)??第二个关于对象在架构层之间移动的问题仍未得到解答。问候, Nagendra U M
    • Fowler 指出 DTO 用于减少远程调用并同时序列化所有数据martinfowler.com/eaaCatalog/dataTransferObject.html。尽管今天我认为我们使用它的用途不止于此,例如我的示例,其主要重点不是减少昂贵的调用,而是不将我的域模型与我的数据持久性机制耦合以进行远程传输。至于架构问题,我不相信它们是 DTO,因为这些对象不受远程传输的影响,这是 DTO 的目的。
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多