2017-02-14 12 views
1

Первая проблема:Asp.net ядро, основные проблемы, я не понимаю

services.AddMemoryCache(); // in Startup config 
public class AController 
{ 
public AController(IMemoryCache cacheA) { } 
} 

public class BController 
{ 
public BController(IMemoryCache cacheB) { } 
} 

проблема заключается в том, что cacheA такая же, как cacheB

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

Вторая проблема;

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

результаты этой службы будут использоваться в контроллерах и отправлены во внешний интерфейс

Как реализовать такую ​​вещь со всеми моделями asp.netcore? кеш должен быть ОДНОМ (одноточечным), поэтому мы не откладываем запросы БД

? добавив такую ​​услугу, как services.SCOPED <>, но затем, как сохранить его кэш же для каждого экземпляра (некоторые одноточечно DI? или статический экземпляр MemoryCache?) я понятия не имею, не проклятая идея не прося о помощи

в узле .js я бы сделал все это в течение нескольких минут, но Microsoft эй

+1

Один взгляд на источник ответил бы на все ваши вопросы: https://github.com/aspnet/Caching/blob/efbbdc5e0a8c8a664ea34cd41220d084b6906f57/src/Microsoft.Extensions.Caching.Memory/MemoryCacheServiceCollectionExtensions.cs#L76-L86 – Tseng

+0

LOL, это хорошая функция, если бы VS (определение Peek Definition - Alt F12) может наглядно показать вам источник – gdpm

ответ

1

определить два интерфейса кэша:

public interface IPrivateMemoryCache: IMemoryCache 
{ 
} 

public interface IPublicMemoryCache: IMemoryCache 
{ 
} 

public class AController 
{ 
    public AController(IPrivateMemoryCache cacheA) { } 
} 

public class BController 
{ 
    public BController(IPublicMemoryCache cacheB) { } 
} 

Теперь вы можете определить различные правила создания экземпляра для вашего контейнера IoC.

+0

Выполнение этого имеет смысл только тогда, когда оба интерфейса определяют другой контракт, или, другими словами, при наличии одного Интерфейс «IMemoryCache» нарушит [Принцип замены Лискова] (https://en.wikipedia.org/wiki/Liskov_substitution_principle). – Steven

+0

Не думайте, что вы полностью получаете LSP. Это связано не только с типами данных и именами элементов данных, но также с подтипами * поведенческого * (что объясняет, например, использование [интерфейсов маркеров] (https://en.wikipedia.org/wiki/Marker_interface_pattern), все из которых имеют одинаковые элементы). Если дизайн требует независимого частного и общего кеша, они логически различаются. –

+0

Я думаю, я понимаю, что LSP просто отлично :) и да, вы правы, это все о поведении. Вопрос здесь в том, что эти реализации ведут себя по-другому с точки зрения потребителя или нет. – Steven