Замок Виндзор PerWebRequest LifeStyle и Application_EndRequest - PullRequest
1 голос
/ 24 декабря 2009

Я регистрирую некоторые компоненты, связанные с Linq2Sql, используя стиль жизни PerWebRequest. Я вижу, как они создаются, но они уничтожаются до того, как мой глобальный метод Application_EndRequest будет вызван. Это по замыслу? Кто-нибудь знает работу вокруг? Я хочу вызывать commit для моего объекта 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();
        }

    }

Спасибо, Corey

Ответы [ 2 ]

1 голос
/ 28 июля 2010

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

1 голос
/ 30 декабря 2009

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

...