Есть ли альтернатива ублюдочной инъекции? (AKA инъекция бедняков через конструктор по умолчанию)

, в некоторых случаях я чаще всего испытываю искушение использовать «ублюдочную инъекцию». правильный «конструктор внедрения зависимостей:

public class ThingMaker {
    ...
    public ThingMaker(IThingSource source){
        _source = source;
    }

Но тогда для классов, которые я собираюсь использовать как общедоступные API (классы, которые будут использовать другие команды разработчиков), я никогда не найду лучшего варианта, чем написать значение по умолчанию» bastard "конструктор с наиболее вероятной необходимой зависимостью:

    public ThingMaker() : this(new DefaultThingSource()) {} 
    ...
}

Очевидным недостатком здесь является то, что это создает статическую зависимость от DefaultThingSource; в идеале такой зависимости не должно быть, и потребитель всегда будет вводить любой IThingSource, который они хотят. Однако, это слишком сложно использовать: потребители хотят создать новый ThingMaker и приступить к работе над созданием вещей, а через несколько месяцев добавить что-нибудь еще, когда возникнет необходимость. На мой взгляд, это оставляет лишь несколько вариантов:

  1. Опустите ублюдочный конструктор; заставить потребителя ThingMaker отключить разобраться в IThingSource, понять, как ThingMaker взаимодействует с IThingSource, найти или написать конкретный класс, а затем внедрить экземпляр в вызов их конструктора.
  2. Опустите внебрачный конструктор и укажите отдельную фабрику, контейнер или другой класс / метод начальной загрузки; каким-то образом заставить потребителя понять, что ему не нужно писать свой собственный IThingSource; вынудить потребителя ThingMaker найти и понять фабрику или загрузчик и использовать его.
  3. Сохранить ублюдочный конструктор, позволяющий потребителю «обновлять» объект и работать с ним, а также справляться с дополнительной статической зависимостью от DefaultThingSource.

Мальчик, №3 кажется привлекательным. Есть другой, лучший вариант? №1 или №2 просто не стоят того.

116
задан Patrick Szalapski 20 July 2011 в 02:29
поделиться