Где мне хранить ссылку на мой контейнер DI?

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


person Mike Comstock    schedule 17.11.2009    source источник
comment
Всем спасибо! Извините за все дубликаты - я подумал, что это обман, но не знал, как сформулировать свой вопрос, чтобы найти их.   -  person Mike Comstock    schedule 17.11.2009


Ответы (2)


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

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

person Jeff Sternal    schedule 17.11.2009

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

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

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

person TrueWill    schedule 17.11.2009
comment
Согласен, и мне нравится, как один плакат поместил это в одну из уловок, которую выкопал Маурисио: поместите контейнер IOC на самый высокий уровень / точку входа в процесс и используйте его для внедрения зависимостей во все, что находится под ним. (stackoverflow.com/questions/480286/ ) - person Jeff Sternal; 17.11.2009
comment
@Jeff - Хорошая цитата; просто и по делу. По этой ссылке также есть отличный ответ Торстена Лоренца (также от Маурисио): stackoverflow.com/questions/480286/ - person TrueWill; 17.11.2009
comment
Если вы поместите контейнер на самый высокий уровень, это, вероятно, создаст необходимость хранить ссылку на вашу сборку самого низкого уровня, которая требует внедрения (возможно, доступа к данным). Меня это немного раздражает :( - person dougajmcdonald; 15.03.2013