[英]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.