首页 新闻 会员 周边

.net core MemoryCache 缓存的问题 @dudu

1
悬赏园豆:20 [已解决问题] 解决于 2018-03-20 17:38
public void ConfigureServices(IServiceCollection services)
    {
        services.AddMemoryCache();
        services.AddMvc();
    }
public class HomeController : Controller
{
    private IMemoryCache _cache;

    public HomeController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }
}

上面是官网文档介绍的使用方法。

我为了方便,比如以后我不用微软官方的缓存,我定义了一个缓存的操作接口和实现类。

    public interface ICacheService
    {

        /// <summary>
        /// 验证缓存项是否存在
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <returns></returns>
        bool Exists(string key);
    }

    public class MemoryCacheService : ICacheService
    {
        protected IMemoryCache _cache;

        public MemoryCacheService(IMemoryCache cache)
        {
            _cache = cache;
        }

        /// <summary>
        /// 验证缓存项是否存在
        /// </summary>
        /// <param name="key">缓存Key</param>
        /// <returns></returns>
        public bool Exists(string key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }
            object cached;
            return _cache.TryGetValue(key, out cached);
        }
}

然后我注入了这个接口和实现类。

        public void ConfigureServices(IServiceCollection services)
        {
            //添加缓存服务
            //services.AddMemoryCache();
            
            //添加Session服务
            services.AddSession();
            //安装mvc服务
            services.AddMvc();


            services.AddScoped<ICacheService, MemoryCacheService>(a=> { return new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions()))); });

        }

请问我这个注入方式是否正确,因为我现在用不了。读取不到报错。下面这行代码这种注入的方式是否正确

services.AddScoped<ICacheService, MemoryCacheService>(a=> { return new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions()))); });

87Super的主页 87Super | 初学一级 | 园豆:107
提问于:2018-03-14 22:40
< >
分享
最佳答案
0

正确的依赖注入姿势

services.AddMemoryCache();
services.AddScoped<ICacheService, MemoryCacheService>();
收获园豆:20
dudu | 高人七级 |园豆:30994 | 2018-03-14 22:50

因为我的实现类要传递一个缓存对象。是不是这样写。

services.AddMemoryCache();
services.AddScoped<ICacheService, MemoryCacheService>(a=> { return new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions()))); });

还是这样写

services.AddMemoryCache(a=> { return new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions()))); });
services.AddScoped<ICacheService, MemoryCacheService>();

 

 

87Super | 园豆:107 (初学一级) | 2018-03-14 23:00

不好意思 刚才看错你的代码了。

services.AddScoped<ICacheService, MemoryCacheService>();

我的意思是 我在注入的时候我的实现类,构造函数的参数是一个缓存的对象。我想请问如何把缓存对象传递过去。

services.AddScoped<ICacheService, MemoryCacheService>(a=> { return new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions()))); });

这样传递对不对。

 

87Super | 园豆:107 (初学一级) | 2018-03-14 23:05

可以了 你的代码是对的。既然会把实现类的对象自动传过去。厉害了。

谢谢你。

87Super | 园豆:107 (初学一级) | 2018-03-14 23:08

@87Super:
如果一定要new,可以这么写:

var cacheService =  new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions())));
services.AddScoped<ICacheService>(_ => cacheService);
dudu | 园豆:30994 (高人七级) | 2018-03-14 23:08

@dudu: 

services.AddMemoryCache();
services.AddScoped<ICacheService, MemoryCacheService>();

//现在我把
services.AddMemoryCache();
添加缓存服务删除掉。直接注入。也正常用。
奇怪了。为什么删除缓存服务。容器还知道IMemoryCache的实现对象
87Super | 园豆:107 (初学一级) | 2018-03-14 23:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册