Re[7]: О пользе Dependency Injection
От: microuser  
Дата: 13.01.21 13:58
Оценка: 2 (1) +1
Здравствуйте, Министр Промышленности, Вы писали:

МП>>>вопрос был в разрезе целесообразности использования DI

МП>>>если можно использовать нормальные конструкторы, зачем там применять DI?
МП>>>или даже зачем заменять нормальное конструирование дополнительными DI сборками и конфигурированием этого всего

M>>Как вообще можно писать бизнес приложения без DI ума не приложу


МП>подозрительное заявление



Не знаю на чем вы пишите, но на C# DI уже давно входит в базовый фреймворк и без него давно никто не работает

https://docs.microsoft.com/en-us/dotnet/core/extensions/dependency-injection

M>>покажите пример, а мы посмотрим.


МП>это не вполне легально по нынешним временам

МП>но всё что я сам писал было без DI кроме мест в проектах где это было уже мне навязано через легаси

Не обязательно весь проект, просто пример как вы пишите классы решающие бизнес задачи, как передаете в них зависимости?
В каком месте приложения конструируете зависимости?
Зачем делаете это руками если есть контейнер который справится с этим сам и без проблем?
Re[6]: Бизнес приложение
От: Sharov Россия  
Дата: 13.01.21 15:28
Оценка:
Здравствуйте, microuser, Вы писали:


M>Нормальное DI как раз и работает через конструкторы. Как вообще можно писать бизнес приложения без DI ума не приложу, покажите пример, а мы посмотрим.


Для банковского или шире, финансового ПО, где требования меняются часто, может и критично. Для любых других приложений может и не надо.
Кодом людям нужно помогать!
Re: О пользе Dependency Injection
От: СвободуАнжелеДевис СССР  
Дата: 13.01.21 15:36
Оценка:
МП>кто-то может популярно расписать преимущества либо природу явления популярности?
МП>(часть плюсов знаю и гипотезы-то я имею, но мнение всё равно такое)

инструмент должен решать задачу.
DI не везде нужен, особенно в вин-формах, имхо.
но вот тебе пример из недавнего с нашего проекта.
есть сервис, пусть будет MyService, который делает достаточно долгий запрос за статическими данными.
есть интерфейс, понятное дело, IMyService.
этот сервис используется в большом количестве мест проекта. через интеферйс, понятное дело, не напрямую создавая инстанс.
запустив нагрузочное тестирование, мы поняли, что мы упираемся в производительность этого сервиса, и если бы мы закешировали данные, получили бы приличный прирост производительности.
дальше, мы создали над MyService обычный декоратор, аля MyServiceWithCache, который так же реализует IMyService интерфейс. всё что там нужно было, поменять регистрацию в DI в одном месте.
дальше, везде подхватилась новая реализаций, реализация нашего декоратора. приложение взлетело.
это лишь один и маленький пример. я могу привести много больше
Нет времени на раскачку!
Re[5]: О пользе Dependency Injection
От: СвободуАнжелеДевис СССР  
Дата: 13.01.21 15:38
Оценка:
МП>если можно использовать нормальные конструкторы, зачем там применять DI?
МП>или даже зачем заменять нормальное конструирование дополнительными DI сборками и конфигурированием этого всего

тебе известны такие понятия как SOLID, и, конкретно, D из этой группы? или что такое DI как паттерн и для чего он вообще нужен?
Нет времени на раскачку!
Re[2]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 13.01.21 15:46
Оценка:
Здравствуйте, gandjustas, Вы писали:


G>Тебе нигде не надо явно создавать логгер, знать его тип или знать что-то о его времени жизни.


Но в composition root (или как там?) его же надо запихнуть в контейнер? Или это можно в файле кофигурировать.
Кодом людям нужно помогать!
Re: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 13.01.21 15:55
Оценка: 25 (6) +6 :)
Здравствуйте, Министр Промышленности, Вы писали:

МП>С моей профессиональной точки зрения DI фреймворки не нужны.


Не нужны для бизнес-логики.

МП>Они затрудняют распутывание кода,

МП>понижают гибкость автоматического рефакторинга (в частности ReSharper-ом)
МП>и это не перекрывается гибкостью подстановки mock-объектов

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

МП>кто-то может популярно расписать преимущества либо природу явления популярности?

МП>(часть плюсов знаю и гипотезы-то я имею, но мнение всё равно такое)

Тут такое дело. Сам по себе DI требует некоторого осмысления. В доисторические времена мы пёрлись от понимания таких вещей как косвенная адресация в ассемблере. Сегодня эту нишу занял DI. А осмыслив эту штуку народ переходит на следующий уровень, где DI превращается в золотой молоток — уверенность в полной универсальности данного инструмента.

Ещё одним усугубляющим проблему фактором является то, что большинство программистов не понимают разницы между написанием таких вещей как System.String и MyCompamy.CustomerService.GetCustomerByID. Не понимают того, что для этих вещей нефункциональные требования абсолютно разные.

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

Проблема и непонимание заключается в том, что бизнес логика, которая будет многократно менятся, пишется как универсальный код, предназначенный для многократного повторного использования. Мы же все здесь минимум архитекторы, так ведь? Любой код сразу пишем как всеоблемющий всемогутор. А раз так, то как же можно получить информацию о кастомере без DI фреймворка и пары IoC контейнеров? Никак не можно.

Ещё один момент. Написание повторно используемых компонентов — это тоже скил, который нужно прокачивать. Без этого получаются не повторно используемые компоненты, а кособокие уродцы.

В результате имеем — неумеха с золотым молотком пишет со всем старанием бизнес логику в стиле универсального всемогутера.

Какждый раз когда я вижу в проекте использование DI фреймворков и IoC контейнеров у меня возникакет именно такое впечатление.
Если нам не помогут, то мы тоже никого не пощадим.
Re[6]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 13.01.21 15:59
Оценка: +5
Здравствуйте, СвободуАнжелеДевис, Вы писали:


САД>тебе известны такие понятия как SOLID, и, конкретно, D из этой группы? или что такое DI как паттерн и для чего он вообще нужен?


Выше уже обратили внимание, что D. Injection D. Inversion не одно и тоже. В SOLID речь идет об Inversion,
для этого Injection можно не использовать, а просто придерживаться соотв. принципов разработки и проектирования.
Достигается легко -- везде и всюду использовать интерфейсы или базовые классы.
Контейнер же вообще не требует от программиста написания оператора new в явном виде, кроме всяческих
абстрактных фабрик и не более.
Кодом людям нужно помогать!
Re[7]: О пользе Dependency Injection
От: СвободуАнжелеДевис СССР  
Дата: 13.01.21 16:02
Оценка: 5 (1)
S>Выше уже обратили внимание, что D. Injection D. Inversion не одно и тоже. В SOLID речь идет об Inversion,
S>для этого Injection можно не использовать, а просто придерживаться соотв. принципов разработки и проектирования.

это один из моих любимых вопросов на интервью. потому как, что такое DI, понимают многие, а вот DIP, увы, единицы.

S>Достигается легко -- везде и всюду использовать интерфейсы или базовые классы.


не всегда так.

S>Контейнер же вообще не требует от программиста написания оператора new в явном виде, кроме всяческих

S>абстрактных фабрик и не более.

он и он никак не решает вопросы с DIP. а так же с L.
Нет времени на раскачку!
Re[5]: О пользе Dependency Injection
От: torvic Голландия  
Дата: 13.01.21 16:05
Оценка:
Здравствуйте, Министр Промышленности, Вы писали:

МП>>>нормальные обычные конструкторы,

МП>>>ну либо статические конструкторы,

МП>вопрос был в разрезе целесообразности использования DI


до этого момента, когда ты спрашивал про DI-фреймворки, всё было правильно,
а сейчас съехал в сторону
передача зависимостей в конструкторе это такое же средство реализации DI
Re[8]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 13.01.21 16:08
Оценка: 2 (1)
Здравствуйте, СвободуАнжелеДевис, Вы писали:

САД>он и он никак не решает вопросы с DIP.


Он упрощает\помогает в решение этого вопроса.

САД>а так же с L.


Про L не скажу, но думается зависит от конфигурации и прочих продвинутых плюшек.
Т.е. где надо вернуть такой-то тип, где-то такой-то. По идее это как-то настраиваемо
в том же Castle.Windsdor.
Кодом людям нужно помогать!
Re[2]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 13.01.21 16:09
Оценка:
Здравствуйте, IncremenTop, Вы писали:

IT>Чего?


Если делать resolve по строковым контстантам, о какой типизации может идти речь?
Кодом людям нужно помогать!
Re[3]: О пользе Dependency Injection
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 13.01.21 21:18
Оценка:
Здравствуйте, Sharov, Вы писали:

IT>>Чего?

S>Если делать resolve по строковым контстантам, о какой типизации может идти речь?

Про какой resolve речь?
С уважением, Artem Korneev.
Re[2]: О пользе Dependency Injection
От: AlexRK  
Дата: 13.01.21 21:20
Оценка:
Здравствуйте, IT, Вы писали:

Могу только подписаться под каждым словом.

Это меня на текущем проекте просто достало. Чуваки с золотыми молотками суют это уродство во все щели — и куда надо, и куда не надо (на самом деле почти никуда не надо). Гора интерфейсов, за которыми найти не возможно просто ничего. Тьфу.
Re[3]: О пользе Dependency Injection
От: IT Россия linq2db.com
Дата: 13.01.21 21:41
Оценка: +1
Здравствуйте, AlexRK, Вы писали:

ARK>Это меня на текущем проекте просто достало. Чуваки с золотыми молотками суют это уродство во все щели — и куда надо, и куда не надо (на самом деле почти никуда не надо). Гора интерфейсов, за которыми найти не возможно просто ничего. Тьфу.


Я такое при возможности выкорчёвываю нещадно. На самом деле есть очень простой и эффективный критерий правильно написанной бизнес логики. Если логически законченный функционал бизнес логики легко извлекается из одного проекта и спокойно переносится в другой, то это правильно написанная бизнес логика. Если же для переезда в соседний дом нужно перетащить с собой весь подъезд, то это не код, а кусок оверинжениринга.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 13.01.21 21:53
Оценка:
Здравствуйте, Artem Korneev, Вы писали:


AK>Про какой resolve речь?


Экземпляра соотв типа.
Кодом людям нужно помогать!
Re[5]: О пользе Dependency Injection
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 13.01.21 21:56
Оценка:
Здравствуйте, Sharov, Вы писали:

AK>>Про какой resolve речь?

S>Экземпляра соотв типа.

При чём здесь строковые константы? Я не понимаю.
Можете дать какой-нибудь пример?
С уважением, Artem Korneev.
Re[3]: О пользе Dependency Injection
От: 3V Россия  
Дата: 13.01.21 22:13
Оценка: :)
Здравствуйте, vopl, Вы писали:

G>>Уже? Доброе утро. Погугли что означает D в SOLID

V>Попробуй сам погуглить, что же именно означает D в SOLID
ололо
inversion это не injection
Re[6]: О пользе Dependency Injection
От: Poopy Joe Бельгия  
Дата: 13.01.21 22:16
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>Если у вас возникают циклические зависимости между компонентами, то вам не избежать DI.

Выстрелив в ногу ее надо потом отрубить, чтобы не мешала...
Re[2]: О пользе Dependency Injection
От: Poopy Joe Бельгия  
Дата: 13.01.21 22:23
Оценка: +1 -1
Здравствуйте, gandjustas, Вы писали:

G>В любом классе, который получается через DI можно написать так:

G>
G>public MyClass
G>{
G>    public MyClass(ILogger<MyClass> logger) { ... }
G>}
G>


И что этом хорошего-то? Все что ты добился это завязал свой класс на внешнее состояние, которое класс не контролирует.
Re[6]: О пользе Dependency Injection
От: Sharov Россия  
Дата: 13.01.21 22:30
Оценка: +1
Здравствуйте, Artem Korneev, Вы писали:


AK>При чём здесь строковые константы? Я не понимаю.

AK>Можете дать какой-нибудь пример?

Я похоже переврал, что конкретно можно делать только resolve по имени, что ослабляло бы типизацию.
Но вот дискуссия на SO, которую я считаю релевантной -- https://stackoverflow.com/a/4988337/241446
В частности вот это:

Errors are pushed to run-time. If you configure your Guice module incorrectly (circular reference, bad binding, ...) most of the errors are not uncovered during compile-time. Instead, the errors are exposed when the program is actually run.

Т.е. из-за DI некоторые ошибки будут заметны на стадии исполнения, нежели при компиляции. Вероятно это ТС имел в виду.
Кодом людям нужно помогать!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.