Constructor Injection: How many dependencies is too many?

Dependency Injection

Dependency Injection Problem Overview


I've been using manual constructor injection DI for a little bit now. One thing that I notice is that my constructors are starting to get rather long.

I have a class that depends on a bunch of little objects - anywhere between 6 and 10 sometimes. As I continue to break my application into smaller chunks, I could see this number increasing over time. Is this a common problem?

Obviously this is going to depend a great deal on the project. However, the basic question is this:

When do you start to get uncomfortable with the number of dependencies that a class has? What are some strategies that you use to reduce these dependencies?

Dependency Injection Solutions


Solution 1 - Dependency Injection

I would not worry about it.

Instead, I would worry about the class being too complex.

A class with many dependencies that uses them all but has no loops or if statements is fine. In some code I was working on recently there were around 14 dependencies in a class. However, there was only one path through the code and no logical way to group the dependencies into better classes.

A class with a small number of dependencies that contains many branch statements or complex loop conditions should be simplified.

Solution 2 - Dependency Injection

This may be a sign that the class with the 6-10 dependencies itself needs to be refactored.

Solution 3 - Dependency Injection

I would think no more than three or four. If you are getting more than that, I would start thinking about how well you are abstracting your concerns. A single repository object, for example, should fulfill all of your data retrieval needs within the class in question.

Solution 4 - Dependency Injection

Runcible,

Here is a link to the Castle Windsor project. It is an Inversion of Control container. These containers allow factory classes to collect your dependencies together and inject them as a single object into your constructor.

http://www.castleproject.org/container/index.html

I have heard good things about Windsor. Spring also makes an IoC container, and there are others.

Solution 5 - Dependency Injection

A class with 6-10 dependencies is a code smell. It is an indication that the class is probably violating the Single Responsibility Principle.

> What are some strategies that you use to reduce these dependencies?

Mark Seemann has made that task clear in his post Refactoring to Aggregate Services and moreso in his book Dependency Injection in .NET. The fact your class has so many dependencies indicates there are more than one responsibilities within the class. Often there is an implicit domain concept waiting to be made explicit by identifying it and making it into its own service. Generally speaking, most classes should never need more than 4-5 dependencies.

Solution 6 - Dependency Injection

You may also want to see if any of the parameters to your constructor should be combined into a single class as well (assuming that the parameters make sense as a class).

It might also be that you want to look at using the ServiceLocator pattern for some of your dependencies. This is particularly true if you're having to pass the dependencies down a long chain of constructors.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRuncibleView Question on Stackoverflow
Solution 1 - Dependency InjectionWW.View Answer on Stackoverflow
Solution 2 - Dependency InjectionJacob BView Answer on Stackoverflow
Solution 3 - Dependency InjectionRobert HarveyView Answer on Stackoverflow
Solution 4 - Dependency InjectionRobert HarveyView Answer on Stackoverflow
Solution 5 - Dependency InjectionNightOwl888View Answer on Stackoverflow
Solution 6 - Dependency InjectionRob ScottView Answer on Stackoverflow