Java 向DTO对象添加行为
这是一个令我困惑的设计问题 正如您所知,对象由属性和行为组成。在web编程中,我实现了几个协议对象作为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
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中存在逻辑时,序列化或封送处理可能是一个关键问题。在这一点上,我会使用完整的“破窗口理论”。