2010-09-16 3 views
0

Является ли механизм Интеграции замка Виндзора хорошим/эффективным способом реализации шаблона Единицы работы?Замок Виндзорский перехватчик и блок работы

Мой проект включает в себя замок Виндзор, NHibernate Facility и, конечно, NHibernate - все они используются в самообслуживаемых WCF-сервисах.

Каждый метод обслуживания обычно запрашивает у контейнера Windsor экземпляр класса-помощника, которому делегирован вызов WCF. У вспомогательного класса есть аргумент конструктора ISessionManager, который Windsor разрешает через NHibernate Facility.

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

То, что я хочу, чтобы переставить обязанности

Я не хочу, помощник WCF ничего знать о сделках или сеансов, поэтому не ISessionManager конструктор ARG, нет ссылки на сделки и не ISession.

Для того чтобы помощник WCF мог осуществлять доступ к данным, его придется полагаться на нового помощника, смею ли я называть его DAO? или не дай бог репозиторий, на котором будут методы для извлечения, запроса и, возможно, сохранения объектов домена.

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

Итак, если DAO и Repos не могут закрыть сеанс, что делать?

Для меня нужен один сеанс NHibernate для вызова службы WCF, где несколько DAO или репозиториев могут вызвать OpenSession столько, сколько им нравится, но все они получают один и тот же сеанс, и в идеале любая попытка распорядиться сеансом будет игнорируется, если его последний Dispose. Не уверен в последнем бит, но, возможно, DAO и репозитории просто вызывают ISessionManager.OpenSession и оставляют его для чего-то еще для очистки и удаления сеанса.

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

Любые мысли?

ответ

1

Так что если DAO и Repos не могут закрыть сеанс , что делать? Сессия, что делать?

Услуги собственные единицы работы, а не DAO. Они выделяют единицы работы.

Spring управляет транзакциями с использованием АОП, поэтому перехватчики звучат как хорошая ставка для управления транзакциями для меня.

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

1

Castle.Service.Транзакции также хорошо сочетаются с остальной частью стека замка и позволяют использовать AOP для обработки транзакций.

Посмотрите на v3! https://github.com/haf/Castle.Services.Transaction

И вики!

Я также создал новый NHibernate фонд:

https://github.com/haf/Castle.Facilities.NHibernate/wiki/NHibernate-Facility---Quick-Start

+0

Спасибо, это, кажется, стоит посмотреть; Я буду исследовать. – IanT8

Смежные вопросы