У меня есть разговор с кем-то на моей работе. Классы и интерфейсы выглядят следующим образом:
public interface ISomeInterface { }
public class ImplementationOfInterface : ISomeInterface { }
public class ClassThatUsesInterface {
private ISomeInterface _interface;
public ISomeInterface Interface {
get => _interface ?? new ImplementationOfInterface();
set => _interface = value;
}
}
99% времени мы будем использовать ImplementationOfInterface
. Последние 1%, вероятно, будут использоваться для модульного тестирования.
Я попытался прочитать о внедрении зависимостей, принципе инверсии зависимостей, сервисе, SOLID и о некоторых других вещах, таких как шаблон / анти-шаблон сервисного локатора, двухэтапный анти-шаблон инициализации и т. Д., Но не нашел никого, кто бы описывал этот способ сделать это.
На полпути ясно, что D в SOLID нарушается; «Принцип инверсии зависимостей;
нужно «зависеть от абстракций, а не от конкреций». Поскольку это довольно легко переопределить в модульных тестах или переключить реализацию, если вы хотите ... что еще больше запутывает меня в этом ..
Даже несмотря на то, что это может быть против D в SOLID и на самом деле ничего не делает после правильного внедрения зависимости, против такого использования действительно трудно спорить.
Лично я предложил внедрить экземпляр через конструктор, но мои коллеги считают, что это слишком большая дополнительная работа, и не вижу преимуществ. Если честно, мне трудно не согласиться, но у меня все еще плохое предчувствие ...
Можете ли вы придумать статьи или весомые аргументы за и против использования этого конкретного "хака"?