在构建Rest API时,我偶然发现了基于this Article的缓存存储库。
Building a CachedRepository via Strategy Pattern
我喜欢这个主意,因为代码看起来不错而且干燥。因此,我去尝试了一下,实现非常不错。
但是现在我想连接我的DI(ASP.Net Core附带的标准Microsoft DI,没有什么花哨的地方),我在那里遇到了麻烦。
基本上,问题是我对同一个接口有多个实现,并且缓存的实现引用了直接实现,如下所示:
Sub Total()
Range("B2").End(xlDown).Offset(1, 0) = _
"=sum($B$2:" & Range("B2").End(xlDown).Address & ")"
End Sub
我在服务中使用它(如文章所述),如下所示:
public class CachedArticleRepository : IArticleRepository
{
public CachedArticleRepository(IArticleRepository article, IMemoryCache cache)
{
_article = article;
_cache = cache;
}
}
public class ArticleRepository : IArticleRepository
{
public ArticleRepository(IAmbientContextLocator locator)
{
_locator = locator;
}
}
我的问题现在是如何配置DI,以便将非缓存变体用于构建缓存存储库,并将缓存存储库用于其他所有内容?
答案 0 :(得分:3)
注册服务时使用工厂委托重载
//...
services.AddScoped<ArticleRepository>();
services.AddScoped<IArticleRepository, CachedArticleRepository>(serviceProvider => {
IArticleRepository nonCachedVarient = serviceProvider.GetService<ArticleRepository>();
IMemoryCache cache = serviceProvider.GetService<IMemoryCache>();
return new CachedArticleRepository (nonCachedVarient, cache);
});
//...
通过这种方式,非缓存变体用于构建缓存存储库,而缓存存储库用于其他所有内容。
以上代码假定所有其他依赖项都已添加到服务集合中。
CachedArticleRepository
已注册为IArticleRepository
,因此只要需要依赖项便可以解决。
您可以更改使用寿命以适合您的需求。 AddScoped
仅用于演示注册过程。