Re[21]: О пользе Dependency Injection
От: takTak  
Дата: 19.01.21 11:45
Оценка:
T>>>>все разговоры в этой теме от банального непонимания, для чего придумали DI / IoC
T>>·>Это верно.
T>>·>А придумали контейнеры для сборки монструозных монолитных enterprise приложений из крупных отдельно поставляемых компонент, плагинной архитектуры, внутри так называемых application servers.
T>> о чём ты вообще? идея юнит-тестирования намного старше веб-серверов...
·>"веб-сервер" я не говорил, не приписывай мне ложные высказывания.
ой, насмешил... твой сервер приложений ещё моложе, чем веб-сервера
·>Для юнит-тестирования контейнер не нужен тоже, чаще даже вреден. Нужен DI.
ну ка покажи, как ты собираешься делать DI без Ioc контейнера


T>>>>как ты с твоим этим кодом будешь писать код, который это проверяет?

·>
T>>·>var mainService = new MainService(new InMemoryProvider(), new Configuration(), new IdentityProvider(Thread.Current.Identity), new FileManager() , new EmailSerice(new SmtrAddress(25.145.789), etc.));
T>>·>...
·>


·>Ты предлагаешь посылать письма и писать файлы из тестов? Особенно весело бороться в тестах с многопоточкой. Нет, в тестахм добрая половина этих зависимостей будут тестовые реализации.


ты сам назвал сервис "Main", а теперь на меня обижаешься ? в том-то и дело, что в одном случае у тебя его в твоём тесте даже инициировать толком не получится, а в моём варианте инициализация и тестового и продуктивного кода выглядит почти одинаково, с одним лишь отличием, что я подменяю то, что тестирую и вызываю тем, что меня в тесте интересует

·>А для второй половины — если же ты хочешь потестировать интеграцию MainService с какими-то фиксированными зависимостями, которые так же используются и в реальном приложении тоже, просто делаешь классическую композицию и у тебя получается переиспользуемый модуль со своими зависимостями, например что-то типа такого:

·>
·>class MainServiceModule
·>{
·>  MainService service;
   
·>  MainServiceModule(DbProvider dbProvider, EmailService emailService)
·>  {
·>     service = new MainService(dbProvider, configuration, new IdentityProvider(Thread.Current.Identity), new FileManager(), emailService);
·>  }
·>}
·>


ну это уже тонкости, как ты там назовёшь: модуль , сервис или ещё как...

T>>этот код показывает, что ты ни разу правильно не написал тестового кода с использованием DI, правильно было бы так:

·>Такой код я писал, конечно. Но с тех пор кое-чему научился.

T>>>Container.Register<InMemoryProvider, DbProvider> ()

·>Это не DI, это контейнер. Разберись в конце-концов что такое DI.

так давай, покажи написанный на твоёй коленке DI без контейнера, мы его оценим
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.