Закрытие сеанса NHibernate после сериализованного возвращаемого объекта WCF - PullRequest
4 голосов
/ 31 января 2011

У меня есть служба WCF, размещенная на IIS, с поведением одного вызова.Я использую Fluent NH для доступа к данным и столкнулся со следующей проблемой.Я не могу закрыть / удалить NH-сессию внутри тела метода, потому что когда сериализация приходит в игру, она не может получить доступ к лениво загруженным полям.Я попытался использовать подход, описанный в ответе на этот вопрос Управление сессиями NHibernate в приложении WCF , но оказывается, что удаление их сессий также происходит до начала сериализации.

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 31 января 2011

Итак, я нашел скомпрометированное решение.Я все еще использую реализацию IDispatchMessageInspector по ссылке выше, но выполняю отсоединение расширения другим способом.

Вот фрагмент из исходной реализации

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
            var extensions = OperationContext.Current.InstanceContext.Extensions.FindAll<UnitOfWorkContextExtension>();

            foreach (var extension in extensions)
            {
                OperationContext.Current.InstanceContext.Extensions.Remove(extension);
            }
        }

Я оставляю сообщение BeforeSendReply пустым(как это происходит до сериализации), но вместо этого внутри AfterReceiveRequest я добавляю экземпляр instanceContext.Closing и отсоединяю расширение в обработчике событий

public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            instanceContext.Extensions.Add(new UnitOfWorkContextExtension(ServiceLocator.IoC.Retrieve<IUnitOfWorkFactory>().Create()));
            instanceContext.Closing += DetachExtension;

            return null;
        }
0 голосов
/ 31 января 2011

Я также заинтересован в правильном решении.

Поскольку типы NHibernate вызывают проблемы с сериализацией WCF (даже для загруженных объектов), я рекурсивно просматриваю граф объектов и заменяю все прокси реальными объектами и базовыми коллекциями .NET с помощью отражения. Таким образом, все объекты, возвращаемые методами WCF, представляют собой простые DTO без ссылок на NHibernate.

Я делаю это явно в методе WCF:

public Document GetDocumentById(int id)
{
    using (var repository = GetRepository()) //Open ISession
    {
        var document = repository.GetDocumentById(id);
        repository.DisconnectObject(document); //Replace proxies
        return document; //Clean object
    } //ISession.Dispose
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...