如何在Nop330中使用缓存

时间:2014-07-08 09:44:39

标签: nopcommerce

我想在客户控制器(登录操作)(Nop.Web)中使用缓存

所以请帮助我。

我正在使用这种方式,但没有用处

create one class in nop.core(domain folder) CustomStoreCache.cs

 public partial class CustomStoreCache
    {
        public ObjectCache StoreCache
        {
            get
            {
                return MemoryCache.Default;
            }
        }
    }

并在客户控制器登录方法中实现缓存 和GetAuthenticatedCustomer()方法FormsAuthenticationService.cs

string cachekey = "Id-" + customer.Id.ToString();
var store = CustomStoreCache.StoreCache[cachekey];

但它在此行CustomStoreCache.StoreCache [cachekey];

上出错

的问候, jatin

1 个答案:

答案 0 :(得分:7)

首先,您不需要创建新的' CacheStore',您需要将适当的缓存实例注入您的控制器。

您需要知道的第一件事是NopCommerce有两个缓存管理器。两者都在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();

默认缓存管理器仅保存当前HTTP请求的数据。第二个,静态缓存,跨越其他HTTP请求。

默认缓存是PerRequestCacheManager,只需将其添加到控制器构造函数中即可获得实例。如果要使用静态缓存,则需要在配置控制器的依赖关系时指示Autofac注入它。看看DependencyRegistrar.cs,有几个例子,例如:

builder.RegisterType<ProductTagService>().As<IProductTagService>()
            .WithParameter(ResolvedParameter.ForNamed<ICacheManager>("nop_cache_static"))
            .InstancePerHttpRequest();

你真的应该使用DI而不是向MemoryCacheManager添加静态引用。这样,您可以在将来根据需要更改缓存提供程序。

我建议您使用nopcommerce约定来访问缓存并使用以下语法:

return _cacheManager.Get(cacheKey, () =>
        { ..... get and return a brand new instance if not found; } );

有很多例子......