Причина, по которой я прошу, состоит в том, что коллекция HttpContext.Current.Items
кажется подходящей для размещения объектов IDisposable
, таких как DataContext
, чтобы хранилище могло получить к нему доступ прозрачно, без необходимости вводить какие-либо зависимости, связанные с определенной технологией ORM, в Repository. Это также позволило бы репозиторию решить, следует ли заниматься UnitOfWork
или взять на себя дополнительную ответственность за фактическое сохранение любых изменений.Является ли объект HttpContext.Current, даже если выбрано исключение?
Например:
страницу:
protected void Page_Load(...)
{
Items[KeyValueFromConfigurationFile] = new DataContext();
var repo = new Repository();
var rootEntity = repo.GetById(1);
}
Репозиторий:
public virtual TEntity GetById(int id)
{
var ctx = HttpContext.Current.Items[KeyValueFromConfigurationFile] as DataContext;
return ctx.TEntities.SingleOrDefault(p => p.Id == id);
}
Конечно, я хотел бы проверить нулям и выполнить шаги, необходимые для получения DataContext
если он не была доступна в коллекции HttpContext.Current.Items
.
Итак, вернемся к моему первоначальному вопросу, указанному выше: Будет ли располагаться HttpContext.Current
вместе с любыми объектами, содержащимися в его коллекции элементов, даже если выбрано исключение?
Спасибо, это работает. Стоит отметить, как часто запускается EndRequest. В этой теме http://www.mojoportal.com/Forums/Thread.aspx?pageid=5&t=1558~-1. Веб-сервер Visual Studio запускает это событие для всех HTTP-запросов (включая изображения, css и т. Д.), Тогда как IIS запускается только во время обработанных страниц .NET. Имейте это в виду, если вы выполняете отладку на VS Web Server, и вы видите, что событие запускается снова и снова. –
'foreach (var v in HttpContext.Current.Items.Values.OfType()) v.Dispose();' –
Denis