9

Мне интересно, как я должен хранить/ссылаться на мой контейнер (ы) инъекции зависимостей. Хорошо ли, чтобы контейнер был статическим свойством в статическом классе? Или я должен иметь контейнер в качестве переменной экземпляра приложения? Мне интересно, каковы плюсы и минусы каждого из них, и какова наилучшая практика для этого в приложениях для веб-приложений, mvc, console и windows?Где я должен хранить ссылку на мой контейнер DI?

+0

дубликат: 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 –

+1

Спасибо всем! Извините за все дубликаты - я подумал, что это был дуп, но не был уверен, как сформулировать мой вопрос, чтобы найти их. –

ответ

5

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

Сказав, что если ваша инфраструктура затрудняет доступ к вашему экземпляру приложения, это не будет целью конца использовать статическую переменную.

1

Я согласен с мистером Вером в этом вопросе. Следует учитывать, что некоторые контейнеры DI реализуют IDisposable, поэтому вы, вероятно, захотите избавиться от контейнера при нормальном завершении программы. См. How do you reconcile IDisposable and IoC?

Также обратите внимание, что часто лучше избегать рассеяния на контейнере DI во всем приложении. Другими словами, старайтесь избегать использования контейнера в глобальном масштабе (Singleton, статическое свойство или даже впрыскивание) для использования в качестве Service Locator.

Вместо этого вы можете использовать возможность контейнера для разрешения зависимостей зависимостей. Например, вы можете создать контейнер при запуске приложения и использовать его для создания своей модели (в MVC). Модель может зависеть от репозитория и веб-службы. Репозиторий может зависеть от регистратора. Контейнер разрешит все это при построении модели. Если вашей модели необходимо создавать экземпляры зависимостей «на лету», введите в нее завод.

+1

Согласен, и мне нравится, как один плакат помещал его в одного из обманутых Маурисио: «Положите контейнер IOC на самый высокий уровень/точку входа в процессе и используйте его для инъекции зависимостей во всем под ним». (http://stackoverflow.com/questions/480286/best-practices-for-ioc-container) –

+0

@Jeff - Хорошая цитата; просто и точно. Также есть отличный ответ Торстен Лоренц в этой ссылке (также из Маурисио): http://stackoverflow.com/questions/480286/best-practices-for-ioc-container – TrueWill

+0

Если вы положите контейнер на самый высокий уровень, это, по-видимому, создает необходимость держать ссылку на вашу самую низкую сборку уровня, которая требует инъекции (возможно, доступ к данным). Это раздражает меня :( – dougajmcdonald

Смежные вопросы