【发布时间】:2017-04-28 08:39:48
【问题描述】:
我正在尝试将一些库从旧的基于 MVC5 System.Web 的堆栈移植到 .Net Core。我遇到的一个问题是缓存的变化。例如,在 MVC5 中,我能够读写 i18n 相关数据:
[代码片段 1]
public static Dictionary<string, IEnumerable<CoreDictionaryResource>> DictionaryResourcesCache {
get { return (Dictionary<string, IEnumerable<CoreDictionaryResource>>)HttpContext.Current.Cache(string.Concat(_Dictionary, DictionaryID, CultureID)); }
set { HttpContext.Current.Cache(string.Concat(_Dictionary, DictionaryID, CultureID)) = value; }
}
但是,我可靠地得知System.Web 及其HttpContext 不包含缓存字段。我可以看到Current 字段,然后是其中的一大堆字段,例如Application 和Session,但可惜没有Cache。
我已经在Startup.cs 中完成了必要的操作,并且该应用程序被配置为在内存缓存和会话中使用。我知道会话可以正常工作,因为我使用
[代码片段 2]
return System.Web.HttpContext.Current.Session.GetObject<User>("AuthenticatedUser");
GetObject 在我创建的扩展中。
我是在尝试使用HttpContext 从缓存中读取数据,或者我需要使用IDistributedCache,如here, here 和SO 所示。
但实际上我只是将方法移植到 [Code Snippet 1]...
您可以在新的 .Net Core 上提供有关缓存的任何指示都会非常有帮助。
仅供参考,我不希望控制器和视图中的任何逻辑。我正在构建的应用程序使用单独的 DLL 进行数据访问和逻辑,因此请不要将任何带有 DI 的示例发布到控制器中。这个问题更多是在基础设施级别,然后才影响到 MVC 堆栈。
谢谢大家。
【问题讨论】:
-
另外,我们的 i18n 字符串不是使用 XML 存储的,而是存储在定制的数据库实例中……但是,这应该不是问题,因为数据访问层中的 CRUD 方法运行正常。我只需要弄清楚如何缓存这些服务器端并读出它们。
-
但是现在,您可以在启动时使用
services.AddMemoryCache();注册内存(或Redis 等分布式缓存),然后解析IDistributedCache或IMemoryCache并在您的中间件中解析它。您不能使用静态字段,因为它违反了 ASP.NET Core 的 IoC/DI 特性和反模式。或者您为它创建一个包含逻辑的类。或者只是使用围绕数据库或内存缓存的新本地化功能, -
参见github.com/damienbod/AspNet5Localization/blob/master/… 获取 sql server 示例
-
感谢 Tseng - 及时注意到。不幸的是,IoC/DI 不是神牛(事实上,SO 本身并不使用 DI,因为它会变得复杂且缓慢)。但是,
IDistributedCache似乎是一个不错的选择。正在考虑 AWS Elasticache 而不是 Redis,但是嘿!猪就是猪。您是否有示例或链接到"new localization feature that's wrapping around an database or memory cache"上的资源 -
我的第二个命令中的链接链接到显示它的文件/存储库。定位器的用法在此处的文档中进行了描述docs.microsoft.com/en-us/aspnet/core/fundamentals/localization
标签: c# .net http caching asp.net-core