Почему я не должен делать свои услуги одиночными (IOC)? - PullRequest
7 голосов
/ 19 августа 2011

Внимание: обратите внимание, что я имею в виду не синглтоны, как наличие частного конструктора и переменную статического экземпляра (или, как кто-то предложил статический класс), а синглтоны, возвращающие один и тот же экземпляр из инверсии контейнера управления во время приложениявремя жизни.

Многие контейнеры используют короткий срок службы по умолчанию.Либо новый экземпляр для зависимости (или для запроса), либо экземпляр для области (например, HTTP-запрос).

Мне интересно, почему контейнеры продвигают недолговечные объекты вместо долгоживущих?

Обратите внимание, что я обычно регистрирую свои услуги только в контейнере.Я регистрирую фабрики в контейнере, если мне нужно создать доменные модели и т. Д.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Провёл ещё какое-то исследование

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

Мои лучшие практики

0 голосов
/ 19 августа 2011

Если многое зависит от того, чем занимается ваша служба.Обычно вы выбираете одноэлементное, если есть некоторое общее состояние, и, как таковая, синхронизация вокруг этого состояния может привести к узким местам, которые будут влиять на масштабируемость.Если нет общего состояния, то вы все равно можете выбрать одноэлементное, но вы должны быть осторожны, чтобы не вводить какое-либо общее состояние в какой-то момент в будущем (или, если вы делаете это, вы эффективно блокируете его).

Если вы возвращаете новый экземпляр службы каждый раз, вам не нужно об этом беспокоиться, и это может привести к лучшей масштабируемости / гибкости в будущем, хотя возврат нового экземпляра также может повлиять на масштабируемость, если этот экземпляр остается дефицитнымРесурсы (например, соединения БД).

Итак, я думаю, что реальный ответ "это зависит".Если вы посмотрите на то, как фреймворки справляются с этим, это, как правило, какое-то промежуточное решение, такое как поддержание пула сервисов (например, пулов соединений db) или модель Wcf для каждой сессии.

...