Asp.net
將 linq 附加到 sql datacontext 到業務層中的 httpcontext
我需要我的 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不久前就該主題寫了一篇相關文章,將您想要做的事情描述為一種模式,換句話說,一種應該重複的做事方式。他提供了一個類來幫助解決這個問題,延遲載入數據庫上下文並將其放入目前上下文中。這種方法存在一些缺陷——您可以在該文章的評論討論中了解它們。評論中還引用了一堆相關文章。