Я регистрирую некоторые компоненты, связанные с Linq2Sql, используя стиль жизни PerWebRequest. Я вижу, как они создаются, но они уничтожаются до того, как будет вызван мой глобальный метод Application_EndRequest. Это задумано? Кто-нибудь знает обходной путь? Я хочу вызывать фиксацию моего объекта 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();
}
}
Спасибо, Кори