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();
}
}
ありがとう、コーリー