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()))); });
正确的依赖注入姿势
services.AddMemoryCache();
services.AddScoped<ICacheService, MemoryCacheService>();
因为我的实现类要传递一个缓存对象。是不是这样写。
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>();
不好意思 刚才看错你的代码了。
services.AddScoped<ICacheService, MemoryCacheService>();
我的意思是 我在注入的时候我的实现类,构造函数的参数是一个缓存的对象。我想请问如何把缓存对象传递过去。
services.AddScoped<ICacheService, MemoryCacheService>(a=> { return new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions()))); });
这样传递对不对。
可以了 你的代码是对的。既然会把实现类的对象自动传过去。厉害了。
谢谢你。
@87Super:
如果一定要new,可以这么写:
var cacheService = new MemoryCacheService(new MemoryCache(Options.Create(new MemoryCacheOptions())));
services.AddScoped<ICacheService>(_ => cacheService);
@dudu:
services.AddMemoryCache(); services.AddScoped<ICacheService, MemoryCacheService>(); //现在我把 services.AddMemoryCache(); 添加缓存服务删除掉。直接注入。也正常用。 奇怪了。为什么删除缓存服务。容器还知道IMemoryCache的实现对象