【问题标题】:Adding behaviour to DTO object向 DTO 对象添加行为
【发布时间】:2016-01-27 07:40:01
【问题描述】:

这是一个让我困惑的设计问题。

如您所知,对象由属性和行为组成。在 Web 编程中,我已经实现了几个协议对象作为 DTO。这些就像:

abstract AbstractRequest{

   public abstract AbstractResponse apply();
...
}

MathLessonRequest extends AbstractRequest{

    public AbstractResponse apply(){
          ..do something based on request
    }
...
}

HistoryLessonRequest extends AbstractRequest{
    public AbstractResponse apply(){
          ..do something based on request
    }
}

而我想做的是,在我的控制器中,我只想做这样的事情:

@RestController
class SchoolRequestController{

    @RequestMapping(value="/",method = RequestMethod.POST, produces = "application/json")
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public AbstractResponse query(AbstractRequest request){

          return request.apply();
    }

}

所以,正如你所看到的,我想让 Request 类负责执行他们所要求的所有内容。

我的问题是,这是一个好的设计吗?赋予 DTO 对象执行其用途的责任是否正确?还是 DTO 对象仅用于数据传输?

PS:这个设计有一个问题,apply方法需要一些其他对象的外部引用,比如services,dao等。那么将这些依赖注入到这个实例中的优雅方法是什么?

【问题讨论】:

    标签: java oop dto


    【解决方案1】:

    通常 DTO 没有逻辑(或非常简单的转换逻辑,例如从出生日期返回一个人的年龄)。

    您可以使用那里的模式...当然,只是对象不是真正的 DTO,而是更丰富的对象(这通常很好)。您没有在类名中添加“DTO”后缀,所以我会说您做得很好,因为 Request 对象可能有一些行为。

    编辑

    我明白你在做什么。可以使用依赖注入 + AOP,但我认为还有其他模式可能有更清晰的区别和更少的黑魔法。

    使用您要使用的方法,您的Request 是您的应用程序(您的域的核心)的入口点,代表您要运行的用例。

    我通常使用的方法是基于域驱动设计 (DDD) 和六边形架构,是使用 DTO,它可能会绑定到传输技术(例如 xml/json 注释)。我使用一层Application Services 作为域逻辑的外观。 Application Service 只负责编排,不负责业务逻辑。

    作为编排的一部分,Application Service 需要获取对具有业务逻辑的对象的引用。在 DDD 中,这些对象通常是Aggregates

    我想我会写更多关于这方面的内容,但是已经有很多非常好的资源来解释如何设计好的应用程序,而且那里的解释比我在这里能做的要好得多:)。

    如果您对此感兴趣,并且不介意多花点时间(也许花几块钱)。我强烈建议您获取Growing Object-Oriented SoftwareImplementing Domain-Driven Design 的副本。这两本书都是优秀的书,非常容易阅读,幸运的是所有的例子都是用 Java 编写的。

    【讨论】:

    • 基于OO原则,就是这样。但是例如,在 apply 方法中,我想从 db 中读取数据,所以我需要将 dao 实例传递给该方法,但这似乎并不优雅。我可以像 apply(OuterDataDao dao) 那样做,但它不能让我灵活地在不同的子类中注入我需要的对象。因为 apply 方法是抽象的并且已经定义为签名:(
    • @Augusto “非常简单的转换逻辑,比如从出生日期返回一个人的年龄” 我觉得连这种简单的逻辑都不应该存在。当 DTO 内部存在逻辑时,序列化或编组可能是个难题。我会对此进行全面的“破窗理论”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2013-09-23
    • 2013-06-21
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多