1

PerWebRequest ライフスタイルを使用して、Linq2Sql に関連するいくつかのコンポーネントを登録しています。それらが作成されるのを見ますが、グローバルの Application_EndRequest メソッドが呼び出される前に破棄されます。それは設計によるものですか?誰かが回避策を知っていますか? UnitOfWork オブジェクトで commit を呼び出して、すべてのリクエストの最後に submitchanges() を実行したいと考えています。Global.asax Application_EndResult を使用することに加えて、同じ結果で IHttpModule も試しました。

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

    }

ありがとう、コーリー

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 に答える