Замок Виндзор PerWebRequest LifeStyle и Application_EndRequest

Я регистрирую некоторые компоненты, связанные с Linq2Sql, используя стиль жизни PerWebRequest. Я вижу, как они создаются, но они уничтожаются до того, как будет вызван мой глобальный метод Application_EndRequest. Это задумано? Кто-нибудь знает обходной путь? Я хочу вызывать фиксацию моего объекта UnitOfWork для submitchanges () в конце каждого запроса. Помимо использования Global.asax Application_EndResult, я также пробовал IHttpModule с теми же результатами.

Я использую Castle 2.0.

Вот как я регистрирую свои материалы в PerWebRequest. Я создаю объект DataCOntextProvider, который содержит L2S DataContext. Этот объект вводится в UoW.

/// <summary>
        /// Register the IUnitOfWorkManager to resolve to LinqToSqlUnitOfWorkManager per web request
        /// </summary>
        public void RegisterLinq2SqlUnitOfWorkPerWebRequest()
        {
            _container.Register(Component.For<IUnitOfWorkManager>()
              .LifeStyle.PerWebRequest
              .ImplementedBy<LinqToSqlUnitOfWorkManager>());
        }

    /// <summary>
    /// Register the IDataContextProvider to resolve to DataContextProvider per web request
    /// </summary>
    public void RegisterDataContextProviderPerWebRequest()
    {
        _container.Register(Component.For<IDataContextProvider>()
          .LifeStyle.PerWebRequest
          .ImplementedBy<DataContextProvider>());
    }

Теперь я просто пытаюсь вытащить UoW из контейнера через CommonServiceLocator (и CSL, и Windsor Adapter - 1.0) из EndRequest следующим образом:

 protected void Application_EndRequest(object sender, EventArgs e)
    {
        //ignore unless this is a page (.aspx) or handler (.ashx)
        if (!RequestCanHaveContext())
            return;

        //get the IUnitOfWork manager
        var uow = ServiceLocator.Current.GetInstance<IUnitOfWorkManager>();

        //if we have one, commit changes at the end of the request
        if (uow != null)
        {
            //don't explicitly dispose of uow or we'll get Disposed exceptions on the context
            uow.Commit();
        }

    }

Спасибо, Кори


person Corey Coogan    schedule 24.12.2009    source источник
comment
groups.google.com/group/castle-project-users/ browse_thread /   -  person Mauricio Scheffer    schedule 26.12.2009
comment
вы проверили, что обработчик endrequest вашего модуля запускается до уничтожения компонента? Кроме того, где / как вы обрабатываете событие уничтожения ядра?   -  person Mauricio Scheffer    schedule 07.01.2010


Ответы (2)


Попробуйте переместить свой Application_EndRequest код в httpmodule и зарегистрируйте его перед PerWebRequestLifestyleModule.

person Mauricio Scheffer    schedule 30.12.2009
comment
Я сделал это. Я получаю очень странное поведение - вещи создаются / уничтожаются без запуска события Micro Kernel's Destroyed. Я не знаю, причиняет ли мне боль ASP.NET. - person Corey Coogan; 31.12.2009
comment
вы проверили, что обработчик endrequest вашего модуля запускается до уничтожения компонента? Кроме того, где / как вы обрабатываете событие уничтожения ядра? - person Mauricio Scheffer; 01.01.2010

ваша реализация IUnitOfWorkManager должна реализовывать IDisposable и в Dispose вызывать SubmitChanges. В качестве альтернативы используйте настраиваемый вывод из эксплуатации и отправьте сообщение об изменениях.

person Krzysztof Kozmic    schedule 28.07.2010