0

最新的方法說明了向MVC \ WebAPI控制器注入實例權限DbContext。它有一些專業人士,但我有一個問題還沒有回答 - 性能的DbContext實例創建將不會被使用。ASP.NET DbContext實例注入但未使用 - 性能問題與否?

根據這個問題:What happens when i instantiate a class derived from EF DbContext?DbContext創建並不是那麼便宜的操作(包括內存和CPU)。而且這兩次糟糕的時候:

  1. 你的行動並不需要的DbContext在所有的(所以你有使用和不使用DB混合行動)
  2. 一些邏輯(如條件)不允許訪問DbContext(eq ModelState.IsValid)。因此,動作將返回結果BEFORE訪問DbContext實例。

所以在這兩個(一個也許另一些情況下)DI創建DbContext的範圍的情況下,它浪費資源,然後就收集它在請求結束。

我沒有做任何性能測試,只是搜索了一些文章的第一。我不認爲這將是100%的表現缺乏。我只是想:「嘿人,你爲什麼創建了對象的實例,如果我根本不使用它的話」。

+0

你有哪個版本的EF? EF核心具有這種新的功能上下文池。 –

+0

@GertArnold它是核心。我遇到了池註冊和遷移組合問題。你的意思是說,dbcontext池的用法擺脫了DbContext實例嗎?我認爲資源仍然會被浪費(但並不經常是這樣)還有更重要的問題即將到來 - dbcontext生存期(緩存,更改跟蹤等) – Sergey

+1

在EF6中,上下文創建被明確設計爲輕量級操作。所以我不明白爲什麼在ef-core中引入了上下文池。坦率地說,這讓我對ef-core中上下文創建的成本有點懷疑。我只是在文檔下面留下了一個關於這個問題的問題。但無論如何,我不會爲此擔心。設計你的控制器,使它們不包含既需要也不需要上下文的方法。在有切實原因時優化這些內容。 –

回答

2

爲什麼你創建對象的實例,如果我根本不使用它的話 。

馬克塞曼在他的書中Dependency Injection in .NET說:「創建一個對象實例的東西.Net框架也非常快。任何性能瓶頸您的應用程序可能會出現在其他地方,所以不要擔心「。

請注意,的DbContext默認啓用延遲加載。只是通過實例化它,對性能沒有太大影響。所以,我不會擔心Dbcontext。但是,如果您有一些自定義類在構造函數中進行繁重的提升,那麼您可能需要考慮重構這些類。

如果你真的想比較性能,你可以用Lazy包裝這些依賴關係,看看你獲得了多少性能。 Does .net core dependency injection support Lazy

+0

可否請您提供聲明的證明:「Dbcontext默認啓用延遲加載」。或者你的意思是延遲加載導航屬性(我作爲第一步禁用)?謝謝! 我仍然認爲DbContext構造函數會進行一些初始化操作,甚至可能會有一些繁重的操作(CodeFirst方法的事件)。它可以預熱,更改跟蹤器初始化或其他。要查看EF源以便了解DbContext構造函數中發生了什麼。如果你有一些關於它的文章 - 我會很感激 – Sergey

0

你可以註冊爲懶惰,或者你可以做我所做的,只需注入IMyDbContextFactory,然後你可以調用Create(),當你真正需要它時(它自己的優點/缺點)將返回DbContext。如果構造函數沒有做任何事情,它不會是一個巨大的打擊,但請記住,它第一次啓動時,它會碰到通過並執行所有模型驗證的靜態構造函數。這個命中只發生一次,但它是一個巨大的打擊。