Я реализовал некоторые компоненты для использования WCF как с контейнером IoC (StructureMap), так и с шаблоном Session per Call. Материал NHibernate чаще всего берется отсюда: http://realfiction.net/Content/Entry/133.
Вроде бы все нормально, но я хочу открывать транзакцию с каждым вызовом и фиксировать в конце, а не просто Flush (), как это делается в статье.
Здесь я сталкиваюсь с некоторыми проблемами и мог бы воспользоваться некоторыми советами. Я не нашел хороший способ отката. Я понимаю, что могу проверить CommunicationState и, если есть исключение, выполнить откат, например, так:
public void Detach(InstanceContext owner)
{
if (Session != null)
{
try
{
if(owner.State == CommunicationState.Faulted)
RollbackTransaction();
else
CommitTransaction();
}
finally
{
Session.Dispose();
}
}
}
void CommitTransaction()
{
if(Session.Transaction != null && Session.Transaction.IsActive)
Session.Transaction.Commit();
}
void RollbackTransaction()
{
if (Session.Transaction != null && Session.Transaction.IsActive)
Session.Transaction.Rollback();
}
Однако я почти никогда не возвращаю неисправное состояние из сервисного вызова. Обычно я обрабатывал исключение и возвращал соответствующий индикатор в объекте ответа и сам откатывал транзакцию.
Единственный способ, которым я могу думать об этом, - это внедрить не только репозитории в мои службы WCF, но и ISession, чтобы я мог выполнить откат и обработать так, как я хочу. Это не устраивает меня и выглядит немного дырявым.
Кто-нибудь еще решает ту же проблему?