[英]How to Per-Request caching in ASP.net core
我的舊代碼如下所示:
public static class DbHelper {
// One conection per request
public static Database CurrentDb() {
if (HttpContext.Current.Items["CurrentDb"] == null) {
var retval = new DatabaseWithMVCMiniProfiler("MainConnectionString");
HttpContext.Current.Items["CurrentDb"] = retval;
return retval;
}
return (Database)HttpContext.Current.Items["CurrentDb"];
}
}
由於我們在核心中不再有 HttpContext 容易訪問,我怎樣才能實現同樣的事情?
我需要從任何地方輕松訪問CurrentDb()
想使用類似 MemoryCache 的東西,但有請求生命周期。 DI 這不是這個項目的一個選項
至少有 3 個選項可以在 ASP.NET Core 中存儲每個請求的對象:
您可以完全重新設計舊代碼:使用內置 DI 並使用以下工廠方法將Database
實例注冊為作用域(每個 Web 請求):
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped<Database>((provider) =>
{
return new DatabaseWithMVCMiniProfiler("MainConnectionString");
});
}
該集合在 HttpRequest 開始時可用,並在每個請求結束時被丟棄。
每個當前異步上下文存儲一個值(一種具有異步支持的[ThreadStatic]
)。 這就是HttpContext
的實際存儲方式: HttpContextAccessor 。
請求中的數據庫或連接字符串不會相同嗎?
如果是這樣,那么您可以通過靜態變量和中間件來完成。
中間件將檢查並設置每個請求開始的信息,靜態變量將存儲該值,然后您的方法可以從靜態變量中讀取它。
其他更簡單的方法是將 IHttpContextAccessor 作為參數注入/傳遞。 有了這個,您可以做最少的更改,但是您可以從每個調用方法傳遞 IHttpContextAccessor 服務。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.