Строго кажучи, введення залежностей лише реально проти НЕ введення залежності - і тому будь-яка стратегія управління залежністю, яка не є введенням залежності.
[Небажане] з'єднання, хоча і не зовсім ортогональне питання, може виникати або пом'якшуватися будь-яким способом. Вони поєднані з DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
DependencyClass
в цьому випадку пов'язане з певним . Але вони обоє поєднані DependencyClass
. Справжнє зло, якщо воно є тут, не є обов'язково з'єднанням, це DependencyLookupConstructor
потрібно змінити, якщо DependencyClass
раптом потрібні власні залежності, які вводяться 1 .
Однак цей конструктор / клас ще більш вільно поєднаний:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Якщо ви працюєте в C #, вищевикладене дозволить вам ServiceLocator
повернути що- небудь після GetMyDoer()
виклику, доки він може, do()
що DependencyLocatingConstructor
має do()
. Ви отримуєте перевагу перевірки підпису під час компіляції, навіть не підключаючись до повного інтерфейсу 2 .
Отже, виберіть свою отруту.
Але в основному, якщо існує конкретна "протилежність" ін'єкцій залежностей, це було б щось інше в царині "стратегій управління залежностями". Серед інших, якщо ви використовуєте в розмові щось із наведеного нижче, я визнаю це НЕ введенням залежності:
- Шаблон локатора обслуговування
- Локатор залежності / Місцезнаходження
- Побудова прямого об'єкта / залежності
- Прихована залежність
- "Не введення залежності"
1. За іронією долі, деякі проблеми, які DI вирішує на більш високих рівнях, є свого роду результатом [перевитрати] використання DI на нижчих рівнях. Я мав задоволення працювати над з непотрібною базою коди складності в усьому , як у результаті розміщення жменьки місць , де ця складність на насправді допомогла ... Я правда упередженого поганому вплив.
2. Використання розташування служби також дозволяє вам легко вказати різні залежності одного типу за їх функціональною роллю від коду виклику , при цьому, як і раніше, значною мірою сприймає спосіб побудови залежності. Припустимо, вам потрібно вирішити User
або IUser
для різних цілей: Наприклад, Locator.GetAdministrator()
проти Locator.GetAuthor()
- або будь-якої іншої . Мій код може запитати те, що йому потрібно функціонально, навіть не знаючи, які інтерфейси він підтримує.