2010-03-20 37 views
6

我需要我的LINQ到SQL數據環境才能在我的業務/數據層爲所有我的資源庫對象訪問。然而,由於這是一個網絡應用程序,我希望根據請求創建並銷燬它。我想知道是否有一個可以懶惰地創建和附加datacontext到當前HttpContext的單例類可以工作。我的問題是:當請求結束時,datacontext會自動處理嗎?下面是我在想什麼的代碼。這是否會達到我的目的:有一個線程安全的數據上下文實例,它是懶惰可用的,並在請求結束時自動處理?將LINQ to sql datacontext附加到業務層中的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; 
     } 
    } 
} 

回答

8

你所想象的是有道理的 - 使用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不會自動爲你做這件事。當然,在真正的應用程序中使用此代碼之前,您需要防止異常等。眩暈的


基思·克雷格寫道:a relevant post on the topic a while ago,描述你想要做的模式,換句話說,做的事情,應該被重複的方式是什麼。他提供了一個類來幫助解決這個問題,以便延遲加載數據庫上下文並將其放到當前上下文中。這種方法存在一些缺陷 - 您可以在關於該帖子的評論討論中瞭解它們。還有一些評論中引用的相關文章。

3

Cheeso的代碼將生成一個InvalidOperationException"Collection was modified; enumeration operation may not execute",因爲它試圖修改它正在迭代的HttpContext項目。

您可以使用列表的副本來防止這種情況。

protected void Application_EndRequest(Object sender, EventArgs e) 
{ 
    var keys = new ArrayList(HttpContext.Current.Items.Keys); 

    foreach (var key in keys) 
    { 
     var disposable = HttpContext.Current.Items[key] as IDisposable; 
     if (disposable != null) 
     { 
      disposable.Dispose(); 
      HttpContext.Current.Items[key] = null; 
     } 
    } 
} 
相關問題