Я регистрирую некоторые компоненты, связанные с Linq2Sql, используя стиль жизни PerWebRequest. Я вижу, как они создаются, но они уничтожаются до того, как мой глобальный метод Application_EndRequest будет вызван. Это по замыслу? Кто-нибудь знает работу вокруг? Я хочу вызывать commit для моего объекта UnitOfWork для submitchanges () в конце каждого запроса. В дополнение к использованию Global.asax Application_EndResult я также попробовал IHttpModule с теми же результатами.
Я использую Castle 2.0.
Вот как я регистрирую свои вещи в PerWebRequest. Я создаю объект DataCOntextProvider, который содержит L2S DataContext. Этот объект вводится в 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>());
}
Теперь я просто пытаюсь извлечь UoW из контейнера через CommonServiceLocator (CSL и Windsor Adapter 1.0) из EndRequest следующим образом:
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();
}
}
Спасибо,
Corey