所以我想创建一些访问外部API的服务,我想缓存来自该服务内部API的常见请求,它依赖于其他3个服务,但我想给它自己的缓存实例,MemoryDistributedCache以后可能会更改其他内容
services.AddSingleton<ISomeApi, SomeApi>(provider => new SomeApi(
Configuration.Get<Options>(),
new MemoryDistributedCache(new MemoryCache(new MemoryCacheOptions())),
provider.GetService<ILogger<SomeApi>>()
));
现在从我的控制器我可以通过DI访问api,它工作得很好,但我不确定它是否有某种反模式或是否有更好的方法
我的意思是真正的问题是分离内部缓存,请求 来自一个服务的IDistributedMemory会给我相同的对象,就像我从另一个服务请求它一样,它们必须分开
答案 0 :(得分:1)
这听起来像你可以使用代理或装饰模式。基本问题是您有一个服务可以进行一些数据访问,另一个服务负责缓存第一个服务的结果。我意识到你没有使用存储库本身,但是CachedRepository模式应该可以满足你的需求。见这里:
http://ardalis.com/introducing-the-cachedrepository-pattern 和 http://ardalis.com/building-a-cachedrepository-via-strategy-pattern
如果您不需要设计的那部分灵活,您可以编写缓存的实现,以便在其构造函数中接收实际的SomeApi类型。