簡體   English   中英

如果多個用戶同時向 Blazor 發出請求會怎樣?

[英]What happens if multiple users make a request in Blazor at the same time?

我實際上只是進入前端和 Blazor 並且正在制作一個簡單的 web 應用程序,該應用程序根據用戶輸入的數據查詢數據庫。 由於我使用的是 Entity Framework Core,因此我必須小心數據庫上下文事務,即在同一個 dbcontext 上不能有兩個同時事務。

由於與 DB 和 EF Core 一起工作的邏輯是在常規 class 和方法中,我想知道兩個用戶是否同時單擊前端上的按鈕,這是否會啟動兩個單獨的線程,它們將具有兩個單獨的 dbcontexts,一切都會很好還是兩個線程(我想它不能只有一個線程,現在是 21 世紀)使用相同的 dbcontext?

為清楚起見 - 我在啟動時使用來自 appsettings.json 的信息創建/實例化我的 dbcontext。 我可以改變它沒問題,我只需要知道我是否應該。

這取決於 DbContext 在 controller 中的范圍。 最簡單的事情是這樣的:

public ActionResult SomeAction( /* params */)
{
    using (var context = new AppDbContext())
    {
        // load and return or update and return data, 
        // preferrably projected ViewModels, not Entities
    }
}

每個請求都使用一個單獨的 DbContext。 這種方法的主要問題是,單獨對 controller 進行單元測試更加困難(模擬 DbContext 和 DbSet 很痛苦),並且為您可能想要分散的更大工作流傳遞 DbContext 可能會很麻煩跨不同的方法或服務。

推薦的模式是依賴注入 /w 一個 IoC 容器,例如 ASP.Net Core 可以原生提供的,或其他類似 Autofac 的模式。 在這里,您的 controller 接受 DbContext 或包裝 DbContext 的工作單元之類的模式,通常作為構造函數參數。 從那里開始,取決於如何將 IoC 容器配置為“范圍”它提供的 DbContexts 的生命周期。 根據容器的不同,有許多選項,但典型的選項是:

  • Singleton -所有請求的一個實例。 (絕對不是我們想要的 DbContext,因為這將在 web 請求之間共享相同的引用)
  • 每個 Web 請求 - 每個 web 請求一個實例。 (推薦的)
  • Per Scope - Allows you to specify a scope boundary (smaller than the web request) and returns the same instance while within that scope.
  • Per Call / Transient - 在請求時返回一個新實例。 (不推薦,因為來自不同服務的實體在同一個 web 請求中訪問 DbContext 將與不同的 DbContext 相關聯。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM