使用ASP.Net Core DI实现策略模式

4
在构建我的Rest API时,我遇到了基于这篇文章构建缓存仓库的问题。 通过策略模式构建CachedRepository 我喜欢这个想法,因为代码看起来很好而且干净。因此我尝试实现它,结果实现效果非常好。
然而,现在我想要连接我的DI(使用标准的Microsoft DI,没有花哨的东西),但我在那里遇到了一些麻烦。
基本上问题是我有多个实现相同接口的类,而缓存实现需要引用直接实现,如下所示:
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,以便为构建缓存仓库使用非缓存变体,而为其他所有内容使用缓存仓库?


在注册服务时,请使用工厂委托。 - Nkosi
2
CachedArticleRepository 类是 装饰器设计模式 的一种实现。 - Steven
1个回答

4

在注册服务时,请使用工厂代理重载

//...

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


非常好用,感谢你再次帮我解决问题,@Nkosi :D - Brezelmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接