Шаблон стратегии с ASP.Net Core DI - PullRequest
0 голосов
/ 26 ноября 2018

При создании API отдыха я наткнулся на создание Кэшированного репозитория на основе этой статьи .

Создание 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, чтобы не кэшированный вариант использовался для построения кэшированного репозитория, а кэшированный репозиторий - для всего остального?

1 Ответ

0 голосов
/ 26 ноября 2018

Использовать фабричную перегрузку делегата при регистрации службы

//...

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 был использован только для демонстрации процесса регистрации.

...