簡體   English   中英

如何在 ASP.net 核心中按請求緩存

[英]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 中存儲每個請求的對象:

1. 依賴注入

您可以完全重新設計舊代碼:使用內置 DI 並使用以下工廠方法將Database實例注冊為作用域(每個 Web 請求):

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<Database>((provider) =>
    {
        return new DatabaseWithMVCMiniProfiler("MainConnectionString");
    });
}

ASP.NET Core 中的依賴注入簡介

.NET Core 依賴注入生命周期解釋

2. HttpContext.Items

該集合在 HttpRequest 開始時可用,並在每個請求結束時被丟棄。

使用 HttpContext.Items

3. 異步本地<T>

每個當前異步上下文存儲一個值(一種具有異步支持的[ThreadStatic] )。 這就是HttpContext的實際存儲方式: HttpContextAccessor

AsyncLocal<T> 在非 async/await 代碼中的作用是什么?

異步 ASP.NET Web API 中的 ThreadStatic

請求中的數據庫或連接字符串不會相同嗎?

如果是這樣,那么您可以通過靜態變量和中間件來完成。

中間件將檢查並設置每個請求開始的信息,靜態變量將存儲該值,然后您的方法可以從靜態變量中讀取它。

其他更簡單的方法是將 IHttpContextAccessor 作為參數注入/傳遞。 有了這個,您可以做最少的更改,但是您可以從每個調用方法傳遞 IHttpContextAccessor 服務。

暫無
暫無

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

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