如何在ASP.net核心中按请求缓存

Edu*_*eni 14 c# caching asp.net-core-mvc 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"];
        }
    }
Run Code Online (Sandbox Code Playgroud)

由于我们没有HttpContext在核心中可以轻松访问,我怎样才能实现同样的目的呢?

我需要CurrentDb()从各处轻松访问

想使用像MemoryCache这样的东西,但是请求生命周期.DI它不是这个项目的选择

Ily*_*kov 13

在ASP.NET Core中至少有3个选项可以存储每个请求的对象:

1.依赖注入

您可以完全重新设计旧代码:使用内置DI并Database使用以下工厂方法将实例注册为作用域(每个Web请求):

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

ASP.NET核心中的依赖注入简介

.net核心依赖注入生命周期解释

2. HttpContext.Items

此集合在HttpRequest开始时可用,并在每个请求结束时被丢弃.

使用HttpContext.Items

3. AsyncLocal <T>

每个当前异步上下文存储一个值(一种[ThreadStatic]具有异步支持的).这是如何HttpContext实际存储的:HttpContextAccessor.

AsyncLocal <T>在非异步/等待代码中有什么影响?

异步ASP.NET Web API中的ThreadStatic