Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向DTO对象添加行为_Java_Oop_Dto - Fatal编程技术网

Java 向DTO对象添加行为

Java 向DTO对象添加行为,java,oop,dto,Java,Oop,Dto,这是一个令我困惑的设计问题 正如您所知,对象由属性和行为组成。在web编程中,我实现了几个协议对象作为DTO。这些是: abstract AbstractRequest{ public abstract AbstractResponse apply(); ... } MathLessonRequest extends AbstractRequest{ public AbstractResponse apply(){ ..do something based

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

正如您所知,对象由属性和行为组成。在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();
    }

}
因此,正如您所看到的,我想让请求类负责执行它们所请求的所有内容

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


PS:这种设计带来了一个问题,即apply方法需要一些其他对象(如服务、dao等)的外部引用。那么,将这种依赖关系注入此实例的优雅方式是什么?

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

你可以用你那里的图案。。。当然,只是对象不是真正的DTO,而是更丰富的对象(这通常是好的)。您没有在类名中添加'DTO'后缀,所以我认为您做得很好,因为
请求
对象可能有一些行为

编辑 我明白你想做什么了。使用依赖注入+AOP是可能的,但我认为还有其他模式可能有更明确的区别,而且黑魔法更少

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

我通常使用的方法是基于域驱动设计(DDD)和六边形体系结构的DTO,它可能与传输技术有某种绑定(例如xml/json注释)。我使用一个层作为域逻辑的外立面。
应用程序服务
只负责编排,而不负责业务逻辑

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

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


如果你对此感兴趣,也不介意多花点时间(也许几美元)。我强烈建议你要一份和。这两本书都是很好的书,很容易阅读,幸运的是所有的例子都是用Java编写的。

基于OO原则,就是这样。但对于ex,在apply方法中,我想从db读取数据,所以我需要将dao实例传递到该方法中,但它看起来并不优雅。我可以像apply(OuterDataDao)那样做,但它没有给我在不同子类中注入所需对象的灵活性。因为apply方法是抽象的,并且已经定义为签名:(@Augusto“非常简单的转换逻辑,例如从出生日期返回一个人的年龄”我认为即使是这种简单的逻辑也不应该存在。当DTO中存在逻辑时,序列化或封送处理可能是一个关键问题。在这一点上,我会使用完整的“破窗口理论”。