Замок Виндзор Компонент зависимости и образ жизни - PullRequest
3 голосов
/ 22 июля 2011

Мне интересно, что лучше всего подходит для образа жизни, связанной с компонентами Castle Windsor. Например, если у меня есть класс репозитория, который зависит от сессии. Если для репозитория установлено значение PerWebRequest, а для сеанса IS задано временное состояние, это создаст какие-либо проблемы для виндзора, освобождающего компоненты, чтобы ГХ мог правильно очистить?

Логически это выглядит так, как будто это будет работать, потому что каждый запрос к репозиторию во время веб-запроса будет получать ссылку на один и тот же экземпляр. Этот экземпляр будет содержать ссылку на один сеанс ISession, который был создан для удовлетворения зависимости Repo при первом запросе. Виндзор будет знать, когда репо выходит за рамки видимости из-за отслеживания PerWebRequest, и, следовательно, должен знать, когда нужно очищать ISession.

Тем не менее, этот пост Кшиштофа Кёмича подразумевает, что у вас не должно быть компонента, зависимого от чего-то с более коротким образом жизни, чем он сам.

[править]

У меня вопрос: допустимо ли, чтобы компонент Windsor зависел от чего-то с более коротким образом жизни, чем он сам (то есть компонент PerWebRequest -> временный компонент)?

Ответы [ 3 ]

6 голосов
/ 16 ноября 2011

Да, это может быть прекрасно, особенно в случае something --> transient.Вещи, о которых вам нужно беспокоиться:

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

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

В качестве альтернативы вы можетесделайте его транзитивной зависимостью через слой косвенности:

singleton -(depends on)-> singleton factory -(resolves)-> per-web-request component.

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

Надеюсь, что это поможет.

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

2 голосов
/ 13 октября 2011

Зачем вам несколько сеансов в одном веб-запросе? Один шаблон, который я обычно использую в веб-приложениях в отношении сессий, - это шаблон Unit of Work. Где веб-запрос является единицей работы.

0 голосов
/ 16 ноября 2011

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

...