我正在使用 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();
}
}
谢谢,科里