我已经创建了一个nopCommerce v3.5 plugin,并希望load a text file在Controller下使用_cacheManager,然后在下一个请求中重用它。
但是_cacheManager总是将NULL还给我,以满足我的请求Key。
这是我代码的一部分:
public class AbcController : Controller
{
private readonly ICacheManager _cacheManager;
public AbcController(ICacheManager cacheManager)
{
this._cacheManager = cacheManager;
}
public ActionResult Test(string title,string titleLink, string backColor, string textColor, string timeColor)
{
try
{
// myText is always NULL here >> :(
var myText = _cacheManager.Get<string>("myText");
if (string.IsNullOrEmpty(jsText))
{
string path = HttpContext.Server.MapPath("~/plugins/Misc.Test/App_Data/text.txt");
myText = System.IO.File.ReadAllText(path);
// Fill cacheManager >>
_cacheManager.Set("myText", myText, int.MaxValue);
}
// Other codes ......
}
// Other codes ......
}
}发布于 2015-02-28 13:11:26
NopCommerce有两个缓存managers.Both在DependencyRegistrar.cs处声明:
builder.RegisterType<MemoryCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_static").SingleInstance();
builder.RegisterType<PerRequestCacheManager>().As<ICacheManager>().Named<ICacheManager>("nop_cache_per_request").InstancePerHttpRequest();默认的缓存是PerRequestCacheManager,您只需将它添加到控制器构造函数中就可以得到一个实例。如果要使用静态缓存,则需要指示Autofac在为控制器配置依赖项时注入它。
DependencyRegistrar.cs,
builder.RegisterType<MyController>()
.WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"));您确实应该使用DI,而不是向MemoryCacheManager添加静态引用。这样,将来如果需要,可以更改缓存提供程序。
发布于 2015-01-27 12:08:07
NopCommerce有两个缓存管理器。在处理相同的http请求时,您将获得一个实例,但该实例不会扩展到其他请求。
您需要注入静态缓存管理器的实例。您可以在我对另一个问题的答复中找到所有的信息:Nopcommerce cache seems empty after adding a list。
https://stackoverflow.com/questions/28152005
复制相似问题