asp.net-mvc – 在MVC Web應用程式中的儲存庫中共享DbContext
題
在MVC Web應用程式中跨多個儲存庫共享EF DbContext的正確方法是什麼?這樣做是審慎/必要的,做或不做這些的陷阱是什麼?
背景
承擔:
> App.MvcSite(幾十個控制器,多個區域等)
> App.Services(服務層,許多服務)
> App.Data(許多儲存庫等)
> …等排除簡單(EF Code First latest)
研究至今
我似乎在SO和網際網路上至少找到了兩三個思路.
>將DbContext共享/覆蓋到請求,以便單個請求具有所有儲存庫共享的單個DbContext.
>在服務層共享/覆蓋您的DbContext– 服務維護一個單一的DbContext,並根據需要將其傳遞到每個儲存庫.
>不要分享一個DbContext,因為它們很便宜,每個Repo都有自己的.
在一個小型網站上,這是一個非問題,這就是為什麼大多數MS和社群示例根本就沒有解決這個問題.
根據我迄今為止的經驗,我沒有使用有限的資料庫.我一直有服務使用DbContext,並直接改變它,所以我不需要擔心這一點.我被告知,從單元測試的角度來看,有限的儲存庫有很大的好處,我們將看看它是否能夠使其餘部分成為可能.
我的想法
(1) Share/scope your DbContext to the Request
這是有趣的,因為它巧妙地避免了一些開發人員認為的答案的單例上下文的缺陷,但是發現DbContext不起作用.但是它似乎有一個缺點,它假定所有的儲存庫,服務等將在整個請求中協調一致 – 這通常不是這樣的,對嗎?如果在另一個完成工作之前由一個repo儲存更改. (外(內(內)))
(2) Share/scope your DbContext at the service layer
這對我來說更有意義,因為每個服務應該協調一個特定的工作單位(小寫意圖).因此,如果在一個請求中使用多個服務,那麼每個都有自己的資料庫上下文是合適的(如果不需要的話).
(3) Do not share a DbContext, since they are cheap
這是我一直做的事情,實際上我幾乎總是隻有一個DbContext每個請求,因為只有一個服務被呼叫.有時可能是兩個,因為兩個服務是由協調工作的控制者召集的.但是,鑑於我目前的應用程式,有許多有限的儲存庫,每個儲存庫都有自己的上下文意味著一個給定的請求可能具有3-10個DbContext例項.我假設(也許不正確)這是有問題的.
重複的問題:
在MVC Web應用程式中跨多個儲存庫共享EF DbContext的正確方法是什麼?這樣做是審慎/必要的,做或不做這些的陷阱是什麼?