Замечательная особенность абстрактных репозиториев состоит в том, что вы можете использовать шаблон Decorator для реализации таких сквозных задач, как кэширование.
В качестве примера, учитывая интерфейс IMyRepository, вы можете создать 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 определяется IMyRepository. Обратите внимание, что оформленный репозиторий вызывается только в том случае, если элемент не найден в кэше.
Это следует принципу Single Resposibility , потому что реальная реализация кэширования может концентрироваться на извлечении и сохранении данных, тогда как декоратор кэширования может концентрироваться на кэшировании. Это позволяет вам изменять их независимо друг от друга.
В нашем текущем проекте мы использовали этот подход, и что особенно приятно, мы могли бы сделать это в качестве запоздалой мысли, даже не касаясь оригинальных репозиториев. Это в духе Открытого / Закрытого Принципа .