如何避免对依赖对象的依赖

时间:2019-12-13 10:47:15

标签: spring dependency-injection dependencies dependency-management

我对Spring Environment有疑问。如果我有一个控制器,并且该控制器内部有很多服务,这些服务是相互依赖的,并且如果我对该控制器进行了某些更改,我应该通过减少代码量来做些“少”的事情吗?这样,我将如何避免依赖问题? ,希望我的问题对您很清楚。

谢谢

2 个答案:

答案 0 :(得分:1)

我的两分钱

  • 使用Spring团队推荐的自动装配构造函数注入。这样做会使控制器变得肿时非常明显(请参阅下一点)
  • 如Bob Martin在他的书Clean Code中所建议的那样,构造函数中的依赖项不超过3个。如果您还有更多,则您的控制人可能违反了单一责任原则。
  • 如果您希望控制器做更多的事情,那么您可能应该将该功能放在第二个控制器中!

一个简单的例子:

    @RestController
    public class PetShopController {

    @Autowired private DogService dogService;
    @Autowired private CatService catService;
    @Autowired private MonkeyService monkeyService;
    @Autowired private FishService fishService;
// all three services above are dependent on the two below
    @Autowired private PetInsuranceService petInsuranceService;
    @Autowired private PetOwnerService petOwnerService; 

    //..and so on
    }

更改为:

@RestController
public class DogsController {

private DogService dogService;

//the insurance/owner services have been split into one service/pet type
private DogInsuranceService dogInsuranceService; 
private DogOwnerService dogOwnerService;

//I've used interfaces for types here
@Autowired DogsController(IPetService dogService,IInsuranceService dogInsuranceService, IOwnerService dogOwnerService) {
this.dogService = dogService;
this.dogInsuranceService = dogInsuranceService;
this.dogOwnerService = dogOwnerService;
}

//..and so on
// make similar controllers for other pets!!

}

我认为这不是在减少代码量,而是在确保每个类都负有单一责任!例如,这里的狗会做狗吠之类的东西!猫会像猫一样发出猫的声音!!一旦您的班级拥有超过3个部门/服务同时完成两个或多个课程,那么该班级就需要拆分!

答案 1 :(得分:0)

  

控制器内部有很多服务,每个服务都依赖   其他

那是设计气味,您甚至可能会遇到这种设计的循环依赖问题。您可能需要在此处发布控制器代码以获取更多帮助。

相关问题