![](/img/trans.png)
[英]Format FilterAttribute result using Strategy Pattern in ASP.NET Core
[英]Strategy Pattern with ASP.Net Core DI
在构建我的Rest API时,我偶然发现了基于这篇文章构建一个Cached Repository。
我喜欢这个主意,因为代码看起来很干净。 所以我去试了一下,实施非常好。
但是现在我想连接我的DI(标准的Microsoft DI与ASP.Net Core一起推出并没什么特别的),我在那里面临一些麻烦。
基本上问题是我有多个相同接口的实现,而缓存实现引用了直接实现,如下所示:
public class CachedArticleRepository : IArticleRepository
{
public CachedArticleRepository(IArticleRepository article, IMemoryCache cache)
{
_article = article;
_cache = cache;
}
}
public class ArticleRepository : IArticleRepository
{
public ArticleRepository(IAmbientContextLocator locator)
{
_locator = locator;
}
}
我在我的服务中使用它(如文章所解释),如下所示:
public class DivisionService : IDivisionService
{
public DivisionService(IArticleRepository article)
{
_article = article;
}
}
我现在的问题是如何配置DI以便非缓存变量用于构建缓存存储库,而缓存存储库用于其他所有内容?
注册服务时使用工厂代理过载
//...
services.AddScoped<ArticleRepository>();
services.AddScoped<IArticleRepository, CachedArticleRepository>(serviceProvider => {
IArticleRepository nonCachedVarient = serviceProvider.GetService<ArticleRepository>();
IMemoryCache cache = serviceProvider.GetService<IMemoryCache>();
return new CachedArticleRepository (nonCachedVarient, cache);
});
//...
这样,Non Cached Variant用于构建Cached Repository,Cached Repository用于其他所有内容。
上面的代码假定所有其他依赖项都添加到服务集合中。
CachedArticleRepository
注册为IArticleRepository
因此只要需要该依赖项,就会解析它。
您可以根据需要更改使用寿命。 AddScoped
仅用于演示注册过程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.