繁体   English   中英

ASP.Net核心DI的战略模式

[英]Strategy Pattern with ASP.Net Core DI

在构建我的Rest API时,我偶然发现了基于这篇文章构建一个Cached Repository。

通过策略模式构建CachedRepository

我喜欢这个主意,因为代码看起来很干净。 所以我去试了一下,实施非常好。

但是现在我想连接我的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM