Это плохо для использования servicelocation вместо инжекции конструктора, чтобы не писать загрузки классов фабрики

источники букв дисков

*But why the letter "C"? Why not "A" or "B"? Why not "Z?"*

Неудивительно, ответ заключается в старых корнях DOS Microsoft. Задолго до того, как Windows существовал, самые совместимые с ПК компьютерные системы имели только один дисковод в нем - дисковод для гибких дисков. В то время пользователи вставили бы свой гибкий диск DOS в компьютер непосредственно перед тем, как они включили его, и компьютер запустится или "загрузится" с помощью программного обеспечения на дискете. Как первое и часто только дисковод, установленный в компьютере, гибкому диску присвоили первая буква алфавита.

7
задан alexandrul 18 May 2010 в 05:31
поделиться

3 ответа

да, это плохо.

  • Зачем писать весь этот код, если вы можете заставить фреймворк выполнять всю работу? Все вызовы IoC.Resolve () лишнее, и вам не нужно напишите их.
  • Другой, даже более важный аспект, это то, что ваши компоненты привязаны к ваш локатор служб.

    Теперь вы не можете создать их экземпляры просто так - вам нужен полностью настроить сервисный локатор в место каждый раз, когда вам нужно использовать компонент.

  • И последнее, по крайней мере, ваш код SL посыпано по всей вашей кодовой базе что нехорошо, потому что когда ты хочешь что-то изменить, вам нужно искать в нескольких местах.
14
ответ дан 6 December 2019 в 11:50
поделиться

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

Мета-обсуждение:
Некоторые структуры DI (например, Guice ) построят для вас фабрику .

Некоторые люди выступают за отделение «нового» от «инъекционного».

2
ответ дан 6 December 2019 в 11:50
поделиться

Я не совсем уверен в этом сильном ответе Кшиштофа «это плохо». Я думаю, что здесь есть некоторый компромисс и предпочтение, не категоризируя их как плохие или хорошие.

  • Я не думаю, что писать эти вызовы IoC.Resolve () более излишне, чем писать конкретные конструкторы или свойства для механизма внедрения. .
  • Я должен согласиться с тем, что вы привязаны к сервису Locator и должны настроить его до создания экземпляра класса. Однако:
    • Вы можете отделить локатор сервисов более конкретными интерфейсами. Тем самым уменьшая связь с помощью огромного локатора сервисов для всех сервисов вашей системы
    • . Да, если вы используете механизм DI, вы удалите все эти IoC.Resolve (), но вам все равно придется использовать своего рода контейнер для создания экземпляра ваши «основные» услуги. DI должен перехватывать эти вызовы, не так ли?
    • Ваш локатор сервисов может (должен?) Быть «автоматически настраиваемым» или, по крайней мере, довольно простым в настройке.
  • См. Выше «разделите локатор сервисов с другими конкретные интерфейсы ... "точка.

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

Но DI не свободна от такой темноты кода. Когда вы используете DI, действительно не очевидно, как эти зависимости просто «появились» (магия DI) в вашем конструкторе. Используя SL, вы, по крайней мере, можете увидеть, откуда берутся эти зависимости.

Но все же, тестируя класс, который раскрывает эти зависимости на его конструкторах, вы (почти) не можете пропустить это. Это не тот случай, когда используется локатор сервисов.

Я не говорю, что Кшиштоф был неправ, потому что я полностью с ним согласен. Но я почти уверен, что использование сервисного локатора - не обязательно плохой «дизайн» и уж точно не просто плохой.

Phil

На самом деле не очевидно, как эти зависимости просто «появились» (магия DI) в вашем конструкторе. Используя SL, вы, по крайней мере, можете увидеть, откуда берутся эти зависимости.

Но все же, тестируя класс, который раскрывает эти зависимости на его конструкторах, вы (почти) не можете пропустить это. Это не тот случай, когда используется локатор сервисов.

Я не говорю, что Кшиштоф был неправ, потому что я полностью с ним согласен. Но я почти уверен, что использование сервисного локатора - не обязательно плохой «дизайн» и уж точно не просто плохой.

Phil

На самом деле не очевидно, как эти зависимости просто «появились» (магия DI) в вашем конструкторе. Используя SL, вы, по крайней мере, можете увидеть, откуда берутся эти зависимости.

Но все же, тестируя класс, который раскрывает эти зависимости на его конструкторах, вы (почти) не можете пропустить это. Это не тот случай, когда используется локатор сервисов.

Я не говорю, что Кшиштоф был неправ, потому что я полностью с ним согласен. Но я почти уверен, что использование сервисного локатора - не обязательно плохой «дизайн» и уж точно не просто плохой.

Phil

Это не тот случай, когда используется локатор сервисов.

Я не говорю, что Кшиштоф был неправ, потому что я полностью с ним согласен. Но я почти уверен, что использование сервисного локатора - не обязательно плохой «дизайн» и уж точно не просто плохой.

Phil

Это не тот случай, когда используется локатор сервисов.

Я не говорю, что Кшиштоф был неправ, потому что я полностью с ним согласен. Но я почти уверен, что использование сервисного локатора - не обязательно плохой «дизайн» и уж точно не просто плохой.

Phil

1
ответ дан 6 December 2019 в 11:50
поделиться