2014-03-03 80 views
2

查看一些在線的MVC示例,我已經看到,通常在控制器中,DbContext變量被聲明爲私有成員變量(即全局)並且可以被所有方法訪問。爲MVC控制器聲明DbContext

但是,我最近遇到了一篇關於ASP.NET身份的文章,並且在控制器中發現,DbContext在每個方法(需要它)內被聲明爲

這種方法是否有安全利益?也許爲了更好的整體安全性而限制安全對象的壽命?!?!

如果沒有,那麼我會看到第一種方法更高效,其中數據庫上下文在控制器加載時實例化。

以下是我能找到關於DbContext的所有信息,但沒有真正回答我的問題。

DbContext declaration - Framework 4.1 - MVC 3.0

MVC, DbContext and Multithreading

回答

4

在每次請求中,控制器的新實例被構造。因此,對於所有意圖和目的,dbcontext是否在構造函數中被實例化,是否在任何給定的方法中被封裝並不重要。

從風格選擇

除此之外,原因申報,幷包含在一個給定的方法的DbContext是:

  • 方法不需要它不會實例化的背景下,消除了開銷(如果有的話)。這也可以使用懶惰的初始化模式來完成。
  • 只要方法完成,環境立即處理,而不是在請求結束時處理。一般來說,這應該不是一個問題;通常如果用戶在等待幾秒鐘以上,你會遇到更大的問題。
  • 不同的方法使用不同的上下文。

其中,一些理由來聲明一個情境,一旦它實例:

  • 你只有一個地方,實例化一個方面,而不是很多。在典型的應用程序中,大多數頁面無論如何都需要來自數據庫的一些信息。
  • 調用其他方法的方法不會分別持有它們自己的上下文對象實例。
  • 您可以創建一個基本控制器類,默認情況下會創建一個dbcontext對象,允許您在所有繼承的控制器中進行DRY。
1

Answer from @Ic。很不錯。我想補充一點,如果您需要將您的請求中的信息傳遞給您的DbContext構造函數,那麼您需要在您的動作方法中創建DbContext的實例。原因是Request對象將在控件進入您的操作方法之前爲空。

更多信息:我需要根據用戶的位置動態構建連接字符串。我將位置保存爲一個通過Request對象訪問的cookie。我在action方法中有一個有效的Request,但它在控制器的構造函數或類級屬性中爲null。