4.4.2 항상 협력자를 주입하라: 그 외에는 원하는 대로 하라
정보 시스템의 클래스는 종종 서로 다른 동작을 구현하며 복잡한 기능을 제공하기 위해 다른 클래스와 협력한다. 예를 들어 앞에서 논의한 MessageSender 클래스는 Bot, UserDirectory, MessageRepository를 협력자로 사용하며, 각각은 ‘사용자에게 메시지를 전송’하는 기능의 여러 측면을 담당한다.
협력자는 항상 주입해야 한다. 협력자는 향후 변경하고 싶거나(예 새로운 봇으로 변경) 테스트 시 목으로 대체하고 싶을 가능성이 있는 의존성이기 때문이다. 예를 들어 테스트 중에 전체 LDAP 서버가 필요하지 않도록 UserDirectory를 목으로 사용할 수 있다.
하지만 모든 의존성이 협력자는 아니다. 클래스는 엔터티나 정보를 나타내는 다른 데이터 구조를 사용할 수 있다. 이런 데이터 구조를 일반적으로 주입하지는 않는다. 클래스나 서비스가 이들을 생성하기 위해 리포지터리나 팩토리를 사용하는 경우가 더 흔하다. 클라이언트가 이미 엔터티를 가지고 있다면, 이를 메서드 파라미터를 통해 다른 클래스에 전달하는 것이 일반적이다.