即使抛出异常,HttpContext.Current也会被处理掉吗?

mke*_*y33 3 c# datacontext idisposable repository-pattern linq-to-sql

我问的原因是因为HttpContext.Current.Items集合似乎是一个放置IDisposable对象的好地方,DataContext因此存储库可以透明地访问它,而不必将与特定ORM技术相关的任何依赖项注入存储库.这也将允许存储库决定是否参与UnitOfWork或承担实际持久存在任何更改的额外责任.

例如:

这页纸:

protected void Page_Load(...)
{
   Items[KeyValueFromConfigurationFile] = new DataContext();
   var repo = new Repository();
   var rootEntity = repo.GetById(1);
}
Run Code Online (Sandbox Code Playgroud)

存储库:

public virtual TEntity GetById(int id)
{
   var ctx = HttpContext.Current.Items[KeyValueFromConfigurationFile] as DataContext;
   return ctx.TEntities.SingleOrDefault(p => p.Id == id);
}
Run Code Online (Sandbox Code Playgroud)

当然,我会检查空值并执行获取a所需的步骤,DataContext如果它在HttpContext.Current.Items集合中不可用.

所以,回到我原来的问题给出了上面的代码:请问HttpContext.Current与任何包含在其项集合对象的布置沿着即使抛出一个异常?

Pau*_*les 13

HttpContext.Current.Items中的对象不会自动处理.您需要自己处理.您可以在global.asax Application_EndRequest中执行此操作:

            foreach (var item in HttpContext.Current.Items.Values)
            {
                var disposableItem = item as IDisposable;

                if (disposableItem != null)
                {
                    disposableItem.Dispose();
                }
            }
Run Code Online (Sandbox Code Playgroud)