【发布时间】:2015-10-08 04:29:45
【问题描述】:
我想将一个存储库包装在另一个存储库中,该存储库将在内部使用传入的存储库时处理缓存。 这样我的缓存逻辑可以与存储库实现完全分离。这种模式还允许我轻松地从内存缓存更改为分布式缓存,也就是说,我可以拥有使用不同缓存类型的不同缓存存储库,因此我可以根据环境插入它们。在 Azure 上我可以使用分布式缓存,但在单个服务器上我可以使用内存缓存。
public sealed class CachingFooRepository : IFooRepository
{
private IFooRepository repo;
private IMemoryCache cache;
public CachingFooRepository(IFooRepository implementation, IMemoryCache cache, IFooCachingRules)
{
if ((implementation == null)||(implementation is CachingFooRepository))
{
throw new ArgumentException("you must pass in an implementation of IFooRpository");
}
repo = implementation;
this.cache = cache;
}
public async Task<bool> Save(IFooItem foo)
{
// TODO throw if foo is null
bool result = await repo.Save(user);
string key = "Key-" + foo.Id.ToString();
cache.Remove(key);
return result;
}
public async Task<IFooItem> Fetch(int fooId)
{
string key = "Key-" + fooId.ToString();
object result = cache.Get(key);
if(result != null) { return (foo)result; }
foo = await repo.Fetch(fooId);
if(foo != null)
cache.Set(key, foo);
return foo;
}
}
显然,虽然 CachingFooRepository 实现了 IFooRepository,但我必须确保将 IFooRepository 的不同实现传递到 CachingFooRepository 的构造函数中,因为它不是 IFooRepository 的真正实现,而是依赖于实际实现。
这个例子是简化的伪代码,是否缓存以及缓存多长时间可以作为 IFooCachingRules 或 IOptions 或类似的东西传入。
所以我的问题是,我怎样才能重新注册服务,使依赖 IFooRepository 的事物将获得 CachingFooRepository 的实例,但 CachingFooRepository 将获得 IFooRepository 的其他一些实现,例如 SqlFooRepository? 我想保留仅依赖于 IFooRepository 的其他类,我不想让任何东西专门依赖于 CachingFooRepository。
这是可能的、可行的、好主意还是坏主意?
【问题讨论】:
标签: c# caching dependency-injection asp.net-core