1

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

我正在使用城堡 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>());
    }

现在我只是想通过 CommonServiceLocator(CSL 和 Windsor 适配器都是 1.0)从 EndRequest 中拉出 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();
        }

    }

谢谢,科里

4

2 回答 2

1

尝试将您的Application_EndRequest代码移动到 httpmodule 并在PerWebRequestLifestyleModule.

于 2009-12-30T20:34:22.043 回答
1

您的实现IUnitOfWorkManager应该实现IDisposable并在 Dispose 中调用 SubmitChanges。或者使用自定义退役提交更改关注。

于 2010-07-28T05:55:35.863 回答