重构具有太多依赖关系的服务

时间:2016-08-18 16:48:16

标签: java spring dependency-injection

我正在开发一个包含Spring FrameworkSpring Boot)和JDBC(无JPAORM)的网络应用程序,因此我可以使用Dependency Injection通过图层使用Beans该结构由三个主要层组成:DB(DAO),服务和控制器。 DAOs注入其他DAOsService layerServices其他ServicesController Layer

我的Database layer由一个DAO组成,用于数据库的每个表。每个DAO都有一般CRUD,并根据需要进行一些具体操作。总共我有超过10张桌子(可能近15张)。

DAO的例子

public class Dao1 implements Crud<Entity, Integer>{


     public Entity findById(Integer id){
          //Impl Jdbc
     }


     public void insert(Entity entity){
          //JDbc impl
     }


    //Other CRUD operations -> Update, delete,...

}

Service layer我将Entities(数据库对象)映射到DTos(数据访问对象)。

问题

我有一个@Service类需要注入过多的数据访问对象依赖项(10个依赖项)。

为什么呢?我有一个复杂的DTO类,需要填写每个entity的一些数据(使用DAOs)并执行一些操作(Update,{ {1}},insert ....

服务示例

delete.

当我查看我的public class ServiceO{ @Autowired private Dao1 dao1; @Autowired private Dao2 dao2; //assume there are 10 daos.... public ObjectComplexDTO findObject(int id){ ObjectComplexDTO dto = mapToObjectComplexDTO(dao1.findById(id)); dto.setOtherObjects(mapToOtherObjectDto(dao2.findByCompleDto(id))); // and so on.... return dto; } } 时,我清楚地看到它需要重构这个课程,但我不确定如何。

我考虑过以下几种选择:

  • 创建一个@Service按功能分组:但提取数据仍然太多,7依赖...
  • 小组ClassDAOs不只有一个DAO)和更复杂Entity并提取更多数据,为SQL提供更多功能Database Engine只有Entities已填充DTOs图层的DAOs数据:问题已移至图层DAO ...
  • 让班级知道它有太多的依赖关系。

您有什么想法来改善这个问题吗?

1 个答案:

答案 0 :(得分:4)

在我的头脑中,我建议重构你的DAO。听起来你每桌有一个DAO。相反,尝试以更加领域驱动的设计风格使您的DAO与业务需求保持一致。您的服务层需要“了解”过多的数据层,因此可能会不必要地与之相关联。