簡體   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