В приложении, которое следовало за Доменным Управляемым Дизайном, где у Вас есть следующие виды понятий
куда в целом Вы поместили бы кэширующийся код для устранения дорогого вызова к базе данных?
Я видел кодовые базы, что просто кэш повсеместно и это трудно к использованию памяти монитора и трудно предоставить инструкции другим разработчикам.
Поймите, что я знаю, что Вы должны только данные кэша, когда Вы должны, я просто задаю общий вопрос.
Прекрасная вещь об абстрактных репозиториях заключается в том, что вы можете использовать рисунок Decorator для реализации таких сквозных проблем, как кэширование.
В качестве примера, учитывая интерфейс имирепозированного интерфейса, вы можете создать такое MyCachingRepository, как этот псевдо код:
public class MyCachingRepository : IMyRepository
{
private readonly IMyRepository repository;
public MyCachingRepository(IMyRepository repository)
{
if(repository == null)
{
throw new ArgumentNullException("repository");
}
this.repository = repository;
}
public Foo SelectFoo(int id)
{
Foo foo = ... // attempt to get foo from cache
if // foo is not it cache
{
foo = this.repository.SelectFoo(id);
// save foo in cache
}
return foo;
}
}
в этом примере, Getfoo определяется имирепозионом. Обратите внимание, как оформленный репозиторий вызывается только в том случае, если товар не найден в кеше.
Это следует по принципу принципе односпаливания [11148770] , поскольку реальная реализация кэширования может сосредоточиться на получении и сохранения данных, тогда как декоратор кэширования может сосредоточиться на кэшировании. Это позволяет вам варьироваться два независимо друг от друга.
В нашем нынешнем проекте мы использовали этот подход, и что очень приятно, что мы могли бы сделать это как запоздалая мысль, даже не касаясь оригинальных репозиторий. Это в духе открытого / закрытого принципа .
Я бы поместил его в репозитории. Репозитории должны быть определены договором, а использование кэша должно быть скрыто за этим договором, чтобы он был прозрачен для потребителя репозитория.