Мне интересно, как я должен хранить/ссылаться на мой контейнер (ы) инъекции зависимостей. Хорошо ли, чтобы контейнер был статическим свойством в статическом классе? Или я должен иметь контейнер в качестве переменной экземпляра приложения? Мне интересно, каковы плюсы и минусы каждого из них, и какова наилучшая практика для этого в приложениях для веб-приложений, mvc, console и windows?Где я должен хранить ссылку на мой контейнер DI?
ответ
Я рекомендую хранить его как переменную экземпляра приложения. Использование статического свойства - делает его глобально доступным singleton - скрывает зависимость вашего приложения от него, что является одной из вещей, которые вы пытаетесь избежать, используя, в первую очередь, контейнер для инъекций зависимостей!
Сказав, что если ваша инфраструктура затрудняет доступ к вашему экземпляру приложения, это не будет целью конца использовать статическую переменную.
Я согласен с мистером Вером в этом вопросе. Следует учитывать, что некоторые контейнеры DI реализуют IDisposable, поэтому вы, вероятно, захотите избавиться от контейнера при нормальном завершении программы. См. How do you reconcile IDisposable and IoC?
Также обратите внимание, что часто лучше избегать рассеяния на контейнере DI во всем приложении. Другими словами, старайтесь избегать использования контейнера в глобальном масштабе (Singleton, статическое свойство или даже впрыскивание) для использования в качестве Service Locator.
Вместо этого вы можете использовать возможность контейнера для разрешения зависимостей зависимостей. Например, вы можете создать контейнер при запуске приложения и использовать его для создания своей модели (в MVC). Модель может зависеть от репозитория и веб-службы. Репозиторий может зависеть от регистратора. Контейнер разрешит все это при построении модели. Если вашей модели необходимо создавать экземпляры зависимостей «на лету», введите в нее завод.
Согласен, и мне нравится, как один плакат помещал его в одного из обманутых Маурисио: «Положите контейнер IOC на самый высокий уровень/точку входа в процессе и используйте его для инъекции зависимостей во всем под ним». (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –
@Jeff - Хорошая цитата; просто и точно. Также есть отличный ответ Торстен Лоренц в этой ссылке (также из Маурисио): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill
Если вы положите контейнер на самый высокий уровень, это, по-видимому, создает необходимость держать ссылку на вашу самую низкую сборку уровня, которая требует инъекции (возможно, доступ к данным). Это раздражает меня :( – dougajmcdonald
- 1. Где я должен хранить токен на клиенте
- 2. Где я должен хранить соединение PDO?
- 3. Где я должен хранить фотографии, загружаемые пользователями?
- 4. Где я должен хранить TrayIcon моего приложения?
- 5. Где я должен хранить изображения, загруженные пользователями?
- 6. Где я должен хранить свои тестовые активы?
- 7. Где я должен настроить свой контейнер DI для служб инфраструктуры домена в DDD?
- 8. Где я должен хранить значения анимации?
- 9. Где я должен хранить отпечаток браузера?
- 10. Где я должен хранить глобальный параметр?
- 11. Где я должен хранить данные SSIS?
- 12. Где я должен хранить свои файлы журналов?
- 13. Где я должен хранить список стоп-слов?
- 14. Где я должен хранить данные приложения?
- 15. Где я должен хранить итераторы mynderscore.js?
- 16. Cherrypy: Где я должен хранить свои шаблоны
- 17. Где хранить мой словарь
- 18. DI-контейнер против заводов
- 19. Как выбрать контейнер DI?
- 20. Управление проектами в приложении, использующем контейнер DI
- 21. Где я должен загрузить мой .unity3d
- 22. Какие преимущества делает контейнер DI на заводе?
- 23. DI или DI/Service Locator контейнер?
- 24. Где я должен bootstraperize мой веб-сайт?
- 25. Где я должен хранить изображение, выбранное на iPhone?
- 26. Где я должен хранить загруженные файлы на сервере?
- 27. Где я должен хранить файлы, загруженные пользователями на моем сервере?
- 28. Где я должен хранить ключ активации «Я» приложения?
- 29. Где я должен хранить код регистратора для уменьшения зависимостей?
- 30. Autofac в веб-приложениях, где я должен хранить контейнер для легкого доступа?
дубликат: http://stackoverflow.com/questions/644747/autofac-in-web-applications-where-should-i-store-the-container-for-easy-access http://stackoverflow.com/ вопросы/277438/abstracting-ioc-container-behind-a-singleton-do-it-wrong http://stackoverflow.com/questions/480286/best-practices-for-ioc-container http://stackoverflow.com/ вопросы/367178/use-of-ioc-container-specific-windsor http://stackoverflow.com/questions/1612682/typical-ioc-container-usage-passing-data-down-the-line –
Спасибо всем! Извините за все дубликаты - я подумал, что это был дуп, но не был уверен, как сформулировать мой вопрос, чтобы найти их. –