Если вы пойдете по маршруту IoC (который я рекомендую), я включу все ваши зависимости в контейнер.
Преимущество заключается в том, что вам никогда не придется беспокоиться о создании этих зависимостей, даже если их тонна многоуровневая.
например, ClassA принимает в своем конструкторе 4 других класса, каждый из которых принимает два других в своем, и каждый из них принимает как минимум ссылку DAL.
В этом случае вам просто нужно сослаться на IoC в вашем слое высшего уровня («корень композиции»), который может быть вашим пользовательским интерфейсом, и сказать «дай мне экземпляр объекта A» затем IoC автоматически создаст экземпляры 20 других экземпляров для различных зависимостей, необходимых для построения графа объектов.
Вашим классам больше не нужно беспокоиться о том, как создавать свои зависимости, если им нужно что-то, они просто вставляют это в конструктор, и IoC гарантирует, что оно его получит.
Я бы также прокомментировал, что 20 зависимостей в одном классе - это определенный запах кода, даже если вы используете IoC . Обычно это указывает на то, что класс делает слишком много вещей и нарушает Принцип единой ответственности .