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

Когда вы используете инъекцию зависимостей?

Недавно я использовал StructureMap и очень хорошо наслаждался опытом. Тем не менее, я могу видеть, как можно легко увлечься взаимодействием всего и заканчивать тем, что классы, которые используют лодку интерфейсов в своих конструкторах. Несмотря на то, что это действительно не проблема, когда вы используете инфраструктуру инъекций зависимостей, она по-прежнему считает, что есть определенные свойства, которые действительно не нужно связывать друг с другом только ради их взаимодействия.

Где вы нарисуете линию на то, что нужно интерфейсить, а просто добавляете свойство в класс?

4b9b3361

Ответ 1

Подумайте о своем дизайне. DI позволяет вам изменить способ функционирования вашего кода с помощью изменений конфигурации. Это также позволяет разрывать зависимости между классами, чтобы вы могли легче изолировать и тестировать объекты. Вы должны определить, где это имеет смысл, а где нет. Там нет ответа pat.

Хорошее эмпирическое правило состоит в том, что если его слишком сложно проверить, у вас есть некоторые проблемы с единой ответственностью и статическими зависимостями. Изолируйте код, который выполняет одну функцию в классе и разбивает эту статическую зависимость, извлекая интерфейс и используя инфраструктуру DI, чтобы ввести правильный экземпляр во время выполнения. Делая это, вы делаете тривиальным тестирование двух частей отдельно.

Ответ 2

Основная проблема с инъекцией зависимостей заключается в том, что, хотя она и дает внешний вид слабо связанной архитектуры, на самом деле это не так.

То, что вы действительно делаете, это перенос этой связи из времени компиляции во время выполнения, но если класс A нуждается в некотором интерфейсе B для работы, то еще должен быть предоставлен экземпляр класса, который реализует интерфейс B.

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

Использует, что я видел полезным для шаблона инверсии управления:

  • Архитектура плагина. Таким образом, делая правильные точки входа, вы можете определить контракт на услугу, которая должна быть предоставлена.
  • Архитектура рабочего процесса. Если вы можете подключить несколько компонентов, динамически подключающих выход компонента к входу другого.
  • Клиентское приложение. Скажем, у вас есть разные клиенты, которые платят за набор "функций" вашего проекта. Используя инъекцию зависимостей, вы можете легко предоставить только основные компоненты и некоторые "добавленные" компоненты, которые предоставляют только те функции, которые клиент заплатил.
  • Перевод. Хотя это обычно не делается для целей перевода, вы можете "вводить" различные языковые файлы по мере необходимости в приложении. Это включает в себя пользовательские интерфейсы RTL или LTR по мере необходимости.

Ответ 3

Инъекционная инъекция должна использоваться только для частей приложение, которое необходимо динамически менять без перекомпиляции базовый код

DI следует использовать для выделения кода из внешних ресурсов (баз данных, веб-сервисов, xml файлов, архитектуры плагинов). Количество времени, которое потребовалось бы для проверки вашей логики в коде, было бы почти запретительным для многих компаний, если вы тестируете компоненты, которые DEPEND в базе данных.

В большинстве приложений база данных не будет динамически изменяться (хотя она и может), но, как правило, почти всегда хорошая практика НЕ ​​привязывать ваше приложение к определенному внешнему ресурсу. Сумма, связанная с изменением ресурсов, должна быть низкой (классы доступа к данным должны редко иметь цикломатическую сложность выше одного в ней).

Ответ 4

Что вы подразумеваете под "просто добавлением свойства в класс?"

Мое эмпирическое правило состоит в том, чтобы сделать классное подразделение проверяемым. Если ваш класс опирается на детали реализации другого класса, их необходимо реорганизовать/абстрагировать до такой степени, что классы могут быть протестированы изолированно.

EDIT: Вы указываете лодку интерфейсов в конструкторе. Я бы посоветовал вместо этого использовать сеттеры/геттеры. Я считаю, что это упрощает работу в долгосрочной перспективе.

Ответ 5

Я делаю это только тогда, когда это помогает с разделением проблем.

Как и кросс-проект, я бы предоставил интерфейс для исполнителей в одном из моих проектов библиотеки, и проект внедрения будет внедрять любую конкретную реализацию, в которой они хотят.

Но об этом... во всех остальных случаях он просто сделает систему излишне сложной

Ответ 6

Даже со всеми фактами и процессами в мире.. каждое решение сводится к решению суда - Забыл, где я читал, что
Я думаю, что это скорее вызов времени/полета. В основном, если вы видите зависимость как объект-кандидат, который может быть заменен в ближайшем будущем, используйте инъекцию зависимостей. Если я увижу 'classA и его зависимости' как один блок для подстановки, то я, вероятно, не буду использовать DI для A deps.

Ответ 7

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

Есть несколько приложений, которые просто отбрасываются, но если есть сомнения, я бы пошел дальше и создавал интерфейсы. После некоторой практики это не очень тяжелое бремя.

Ответ 8

Еще один пункт, с которым я борюсь, - где я должен использовать инъекцию зависимостей? Где вы зависите от StructureMap? Только в стартовом приложении? Означает ли это, что все реализации должны передаваться от самого верхнего слоя до самого нижнего слоя?

Ответ 9

Я использую Castle Windsor/Microkernel, у меня нет опыта ни с чем другим, но мне это очень нравится.

Как вы решаете, что вводить? До сих пор следующее эмпирическое правило хорошо мне помогло: если класс настолько прост, что ему не нужны модульные тесты, вы можете свободно создавать его в классе, иначе вы, вероятно, захотите получить зависимость от конструктора.

Что касается того, нужно ли создавать интерфейс, а просто создавать свои методы и свойства виртуальным, я думаю, что вы должны идти по интерфейсу, либо если вы либо a) можете видеть, что класс имеет некоторый уровень повторного использования в другом приложении (то есть, регистратор ) или b) если либо из-за количества параметров конструктора, либо из-за того, что в конструкторе существует значительная логика, класс иначе сложно подделать.