Подтвердить что ты не робот

Инъекция конструктора: Сколько зависимостей слишком много?

Я использовал ручную конструкцию DI для DI немного. Одна вещь, которую я замечаю, заключается в том, что мои конструкторы начинают становиться довольно длинными.

У меня есть класс, который зависит от множества маленьких объектов - иногда между 6 и 10. Поскольку я продолжаю разорвать свое приложение на более мелкие куски, я мог видеть, что это число увеличивается с течением времени. Это обычная проблема?

Очевидно, это сильно зависит от проекта. Однако основной вопрос заключается в следующем:

Когда вы начинаете испытывать дискомфорт по количеству зависимостей, которые имеет класс? Какие стратегии вы используете для сокращения этих зависимостей?

4b9b3361

Ответ 1

Это может быть признаком того, что сам класс с 6-10 зависимостями должен быть реорганизован.

Ответ 2

Я бы не стал беспокоиться об этом.

Вместо этого я буду беспокоиться о том, что класс слишком сложный.

Класс со многими зависимостями, который использует их все, но не имеет циклов или если инструкции в порядке. В некотором коде, в котором я работал, в последнее время в классе было около 14 зависимостей. Однако через код был только один путь и логический способ группировки зависимостей в более качественные классы.

Класс с небольшим числом зависимостей, который содержит множество инструкций ветвления или сложных условий цикла, должен быть упрощен.

Ответ 3

Я думаю, не больше трех или четырех. Если вы получите больше, я начну думать о том, насколько хорошо вы абстрагируете свой concerns. Например, один объект repository должен выполнять все ваши потребности в поиске данных в соответствующем классе.

Ответ 4

Runcible,

Вот ссылка на проект Castle Windsor. Это контейнер Inversion of Control. Эти контейнеры позволяют классам factory собирать ваши зависимости вместе и вставлять их как один объект в ваш конструктор.

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

Я слышал хорошие вещи о Виндзоре. Spring также создает контейнер IoC, а есть другие.

Ответ 5

Класс с 6-10 зависимостями - это запах кода. Это признак того, что класс, вероятно, нарушает принцип единой ответственности.

Какие стратегии вы используете, чтобы уменьшить эти зависимости?

Марк Симанн ясно изложил эту задачу в своем посте " Рефакторинг для агрегированных сервисов", а также в своей книге " Внедрение зависимостей в .NET". Тот факт, что ваш класс имеет так много зависимостей, указывает на то, что в классе более одной обязанности. Часто существует неявная концепция домена, ожидающая, чтобы ее сделали явной, идентифицировав ее и превратив в собственную службу. Вообще говоря, большинству классов никогда не нужно больше 4-5 зависимостей.

Ответ 6

Вы также можете увидеть, должен ли какой-либо из параметров вашего конструктора быть объединен в один класс (при условии, что параметры имеют смысл как класс).

Возможно также, что вы хотите взглянуть на использование шаблона ServiceLocator для некоторых ваших зависимостей. Это особенно верно, если вам нужно передать зависимости вниз по длинной цепочке конструкторов.