Подходящий жизненный цикл для классов репозитория с использованием Castle Windsor

Когда я начинал с Windsor, я думал, что DI будет простым. Теперь это вызывает у меня все большее замешательство.

Репозиторий кажется мне классом с одноэлементным жизненным циклом. У меня должен быть один экземпляр FooRepository для загрузки и сохранения Foos в базе данных в течение всего времени существования приложения.

Тем не менее, каждый репозиторий содержит ссылку на UnitOfWork, который выполняет грязную проверку, работает с базой данных и т. д. UnitOfWork имеет жизненный цикл PerWebRequest — для UnitOfWork нет никакого смысла быть синглтоном, поскольку экземпляр синглтона может (например) сбросить изменения, сделанные несколькими сеансами пользователя одновременно.

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

Может ли кто-нибудь объяснить на простом английском языке (хорошо, может быть, с некоторым кодом), подходящий способ управления жизненным циклом классов Repository и UnitOfWork в веб-приложении?


person David    schedule 23.09.2010    source источник


Ответы (2)


Эмпирическое правило: компонент не должен зависеть от других компонентов, которые переживут его.

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

Мой подход к репозиторию — сценарий UoW заключается в том, что мой UoW предназначен для каждого веб-запроса, но репозитории не имеют состояния и являются временными.

person Krzysztof Kozmic    schedule 23.09.2010
comment
Переходный? А, интересно. Но, по-видимому, использование репозитория PerWebRequest с PerWebRequest UoW (как я сейчас делаю) также нормально? (Кажется, работает для меня, во всяком случае.) - person David; 23.09.2010
comment
Что вы подразумеваете под безгражданством? Вы имеете в виду, что у них нет ссылки на UoW? - person David; 23.09.2010
comment
О, предложенное редактирование - «компонент не должен зависеть от других компонентов, которые переживут его». Но я знаю, что вы имели в виду, спасибо! - person David; 23.09.2010
comment
без гражданства означает, что у него нет собственного состояния. Он сохраняет ссылку на UoW - person Krzysztof Kozmic; 23.09.2010

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

В идеале это должно быть для каждого запроса (в соответствии с концепцией единицы работы). Единственным преимуществом этого подхода является то, что вы включили режим совместимости с Asp.net в своем приложении (если это не Asp.net). Другой способ — пометить репозиторий как временный. Но недостатком этого подхода является то, что Castle будет создавать новый объект репозитория каждый раз, когда он нужен компоненту.

person uttamkini    schedule 05.10.2011