Asp.net

將 linq 附加到 sql datacontext 到業務層中的 httpcontext

  • June 1, 2013

我需要我的 linq to sql 數據上下文在我的業務/數據層中可用,以便我的所有儲存庫對象訪問。但是,由於這是一個網路應用程序,我想根據請求創建和銷毀它。我想知道是否有一個可以懶惰地創建數據上下文並將其附加到目前 HttpContext 的單例類可以工作。我的問題是:請求結束時數據上下文會自動處理嗎?下面是我所想的程式碼。這是否可以實現我的目的:擁有一個執行緒安全的數據上下文實例,該實例是延遲可用的,並且在請求結束時會自動釋放?

public class SingletonDC
{
   public static NorthwindDataContext Default
   {
       get
       {
           NorthwindDataContext defaultInstance = (NorthwindDataContext)System.Web.HttpContext.Current.Items["datacontext"];
           if (defaultInstance == null)
           {
               defaultInstance = new NorthwindDataContext();
               System.Web.HttpContext.Current.Items.Add("datacontext", defaultInstance);
           }
           return defaultInstance;
       }
   }
}

您的想像是有道理的——使用 HTTP 請求上下文來儲存東西——但是**不,**儲存在目前 HttpContext 中的一次性對像不會在請求結束時自動被釋放。不知何故,您將不得不自己處理。

有一個“結束請求”事件,您可以輕鬆掛鉤,例如使用放入 Global.asax.cs 的程式碼。在您的 Application_EndRequest() 方法中,您可以Dispose()手動呼叫列表中需要它的每個對象。

一種方法是遍歷上下文中的每個項目,測試 IDisposable,然後在適當時呼叫 Dispose。

protected void Application_EndRequest(Object sender, EventArgs e)
{
   foreach (var key in HttpContext.Current.Items.Keys) 
   {
       var disposable = HttpContext.Current.Items[key] as IDisposable;
       if (disposable != null)
       { 
          disposable.Dispose();
          HttpContext.Current.Items[key] = null; 
       } 
   }
}

我認為應該這樣做。ASPNET 不會自動為您執行此操作。當然,在實際應用程序中使用此程式碼之前,您需要防止異常等。


Vertigo 的 Keith Craig不久前就該主題寫了一篇相關文章,將您想要做的事情描述為一種模式,換句話說,一種應該重複的做事方式。他提供了一個類來幫助解決這個問題,延遲載入數據庫上下文並將其放入目前上下文中。這種方法存在一些缺陷——您可以在該文章的評論討論中了解它們。評論中還引用了一堆相關文章。

引用自:https://stackoverflow.com/questions/2482220