Martin Flower说过,一个Web应用,从一个Controler->Service->DAO->数据库开始是个不错的开始(大意)。我相信很多项目可能都是这样的一个结构(我以前也是)。但这样的结构有个问题:Service层实际上应该是业务逻辑层,他依赖的DAO,这样就和DAO耦合在了一起。同时Service层作为一层,业务逻辑没有清晰剥离。因此有些人有疑问,在采用了这样的架构后,我们面向对象的特征去哪里了?怎么感觉都在写面向过程的代码呢?
要解决这个问题,首先要把Service层进行分割。对业务来说,业务分为业务实体(数据)、业务用例(操作)两种。既然业务层应该和其他任何层都无关,那么他就应该能独立打包、发布,比如以Java的Jar形式发布。在开发工具中,比如idea,可以将业务逻辑划分一个单独的Module,这个Module里面基本不依赖任何第三方包(除了少出极为底层的,如Lombok、guava等)。这个业务层同时声明一些数据库等方面的接口,通过接口实现数据存取、通信等功能。通过依赖注入框架如Spring,将具体的实现进行注入。这样业务逻辑就完全剥离了出来。因为这部分包含了纯粹的业务逻辑,因此原则上需要100%的单元测试覆盖。
这里写了个例子,演示如何在idea下面进行业务启动编程: https://github.com/bobdeng/ddd-quiz