Как понять правило: контейнер IoC должен быть явно использован только в Bootstrapper? - PullRequest
3 голосов
/ 12 сентября 2011

Правильно ли я понимаю, что 1) В идеале, метод разрешения должен вызываться только один раз и строить весь граф приложения за один раз.2) классы библиотеки должны быть готовы к использованию инструмента IoC (публиковать все зависимости), но не должны «тайно» использовать любые контейнеры IoC;поэтому следует избегать ситуаций, когда мы создаем контейнер на любых других слоях, кроме «bootsrapper».3) Отправка IContainer в подклассы для дополнительных «решений» также является неудачным решением.

Эти принципы очень логичны для меня, я их разделяю.Но у меня все еще есть сомнения в ответе на этот вопрос: «почему до сих пор используются такие понятия, как ..»

1) переходный срок службы - поскольку мы строим инфраструктуру при запуске, все объекты должны жить ».время жизни "и, как правило, должны быть одиночками;если нам нужно создать несколько объектов «на вызов», то с помощью IoC мы разрешаем только их абстрактные фабрики, которые должны создавать объекты инфраструктуры «на вызов» (избегая «вложенных» контейнеров и экземпляров «временных» контейнеров);2) субконтейнеры, родительские / дочерние контейнеры;3) «время жизни иерархии».

Теперь я объясняю для себя, что эти концепции существуют как решения для «не идеального мира», но, может быть, я что-то упускаю?

1 Ответ

4 голосов
/ 12 сентября 2011

Даже если вы разрешаете только один объектный граф (что имеет место, например, в настольном приложении), Transient все равно отличается от Singleton, потому что у вас может быть абстракция, которая используется несколькими потребителями (например, интерфейс ILog).Если время жизни - Временное, каждый потребитель получит свой собственный экземпляр, но если время жизни - Синглтон, все потребители будут использовать один и тот же экземпляр.

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

Все это обсуждение только расширяется, когда вы рассматриваете приложения на основе запросов, такие как веб-сайты или службы.Для таких приложений синглтоны могут совместно использоваться многими различными запросами, но должен быть поточно-ориентированным, тогда как временные объекты более безопасны, но менее эффективны.

В некоторых контейнерах навеб-запрос образ жизни, чтобы обеспечить среднее решение для тех случаев, но те, которые не часто имеют иерархический или контекстный образ жизни, который можно использовать для решения того же сценария, так как вы можете создатьобласть контейнера для каждого HTTP-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...