ASP.Net Core DI的策略模式

时间:2018-11-25 23:54:15

标签: c# asp.net-core dependency-injection asp.net-core-webapi

在构建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,以便将非缓存变体用于构建缓存存储库,并将缓存存储库用于其他所有内容?

1 个答案:

答案 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仅用于演示注册过程。