Castle Windsor PerWebRequest LifeStyle和Application_EndRequest

时间:2009-12-24 03:39:04

标签: asp.net castle-windsor global-asax perwebrequest

我正在使用PerWebRequest生活方式注册与Linq2Sql相关的一些组件。我看到它们被创建了,但是在我的全局的Application_EndRequest方法被调用之前它们被销毁了。这是设计的吗?有谁知道一个工作?我想在我的UnitOfWork对象上调用commit,以便在每个请求结束时提交changes()。除了使用Global.asax Application_EndResult之外,我还尝试了一个具有相同结果的IHttpModule。

我正在使用Castle 2.0。

这是我如何使用PerWebRequest注册我的东西。我正在创建一个保存在L2S DataContext上的DataCOntextProvider对象。该对象被注入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>());
    }

现在我只是试图从EndRequest中通过CommonServiceLocator(CSL和Windsor Adapter都是1.0)从容器中取出UoW,如下所示:

 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();
        }

    }

谢谢, 科里

2 个答案:

答案 0 :(得分:1)

尝试将您的Application_EndRequest代码移至httpsodule和 在PerWebRequestLifestyleModule之前注册。

答案 1 :(得分:1)

IUnitOfWorkManager的实施应该实现IDisposable并在Dispose中调用SubmitChanges。或者使用自定义停用提交更改问题。