Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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 重构依赖项过多的服务_Java_Spring_Dependency Injection - Fatal编程技术网

Java 重构依赖项过多的服务

Java 重构依赖项过多的服务,java,spring,dependency-injection,Java,Spring,Dependency Injection,我正在用Spring框架(Spring Boot)和JDBC(无JPA或ORM)开发一个Web应用程序,所以我使用依赖注入通过层使用bean。该结构由三个主要层组成:数据库(DAOs)、服务和控制器DAO被注入到其他DAO或服务层和服务中的其他服务和控制器层中 My数据库层由数据库中每个表的一个DAO组成。每个DAO都有通用的CRUD和一些根据需要的特定操作。我总共有10多张桌子(大约15张) 道的例子 public class Dao1 implements Crud<Entity, I

我正在用
Spring框架
Spring Boot
)和
JDBC
(无
JPA
ORM
)开发一个Web应用程序,所以我使用
依赖注入
通过层使用
bean
。该结构由三个主要层组成:数据库(DAOs)、服务和控制器<代码>DAO
被注入到其他
DAO
服务层
服务
中的其他
服务
控制器层

My
数据库层
由数据库中每个表的一个
DAO
组成。每个
DAO
都有通用的
CRUD
和一些根据需要的特定操作。我总共有10多张桌子(大约15张)

道的例子

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
时,我清楚地看到需要重构这个类,但我不确定如何重构

我已考虑过以下选择:

  • 创建一个
    ,该类按功能分组:但提取的数据太多,7个依赖项
  • DAO
    (对于
    实体
    ,没有一个
    DAO
    )并使
    SQL
    更加复杂,提取更多数据,从而在只有
    dto
    拥有的
    实体中的
    数据库引擎
    具有更多功能,然后填充
    DAOs
    层:问题转移到
    DAO
  • 让类知道它有太多的依赖项

你有什么办法来改进这个问题吗

我马上建议重构DAO。听起来好像每个桌子都有一把刀。相反,尝试以更领域驱动的设计风格使DAO与业务需求保持一致。您的服务层需要“了解”太多关于数据层的信息,因此可能会不必要地与数据层耦合。

我不知道,我建议重构DAO。听起来好像每个桌子都有一把刀。相反,尝试以更领域驱动的设计风格使DAO与业务需求保持一致。您的服务层需要“了解”太多关于数据层的信息,因此可能会不必要地与数据层耦合。

如果您需要建议,请显示您的代码,并且,当您发布更多代码时,您可以尝试codereview.stackexchange.com。。。但这可能更多的是关于好的DDD…如果你想得到建议,请展示你的代码,也许当你发布更多的代码时,你可以试试codereview.stackexchange.com。。。但这可能更多的是关于好的DDD…请记住,您仍然可以有在表级别执行CRUD操作的DAO,但它们不一定需要在域层之外公开。您可以在内部使用它们来实现提供给服务层或UI层的外部API。请记住,您仍然可以使用在表级别执行CRUD操作的DAO,但它们不一定需要在域层之外公开。您可以在内部使用它们来实现提供给服务或UI层的外部API。
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;

  }
}