2017-02-13 2 views
0

, поэтому я хочу создать службу, которая обращается к внешнему API, и я хочу кэшировать общие запросы из API внутри этой службы, это зависит от 3 других служб, но я хочу дать ей свой собственный экземпляр кэш, MemoryDistributedCache впоследствии может быть изменено на что-то другоеПравильно ли это aspnetcore? Service & Dependency Injection

services.AddSingleton<ISomeApi, SomeApi>(provider => new SomeApi(
    Configuration.Get<Options>(), 
    new MemoryDistributedCache(new MemoryCache(new MemoryCacheOptions())), 
    provider.GetService<ILogger<SomeApi>>() 
    )); 

теперь от моих контроллеров я могу получить доступ к API через DI, он прекрасно работает, но я не уверен, если кто-то его рода анти-паттерна, или если есть лучше способы сделать это

Я имею в виду, что настоящая проблема заключается в отделении внутреннего кеша, запрашивая IDistributedMemory из одной службы w ould дает мне тот же объект, как если бы я запрашивал его из другой службы, они должны быть отделены.

+1

Зачем нужен отдельный кеш? Кроме того, просто примечание: 'GetService ()' возвращает null, если служба не найдена. Поэтому, если вашему сервису действительно нужен регистратор, используйте 'GetRequiredService ()'. – juunas

+0

позволяет сказать, что один кэш поддерживается одной системой базы данных, второй кэш поддерживается другим – gdpm

ответ

1

Это похоже на то, что вы можете использовать для прокси или декоратора. Основная проблема заключается в том, что у вас есть служба, которая выполняет некоторый доступ к данным, и другую службу, ответственную за кэширование результатов первой службы. Я понимаю, что вы не используете репозиторий per se, но тем не менее шаблон CachedRepository должен работать для ваших нужд. Смотрите здесь:

http://ardalis.com/introducing-the-cachedrepository-pattern и http://ardalis.com/building-a-cachedrepository-via-strategy-pattern

Вы можете написать кэшированные реализацию таким образом, что он принимает в фактический тип SomeApi в его конструктор, если вам не нужна эта часть конструкции должна быть гибкой.