Где поставить кеш? Это зависит.
Если ваш сценарий будет заключаться в том, что вы добавляете свой IAddressRepository в несколько сервисов приложений (я полагаю, вы называете их доменными службами), результатом будет:
- Кэширование на уровне хранилища приведет к тому, что все сервисы получат выгоду (Плюсы).
- Кэширование на уровне репозитория приведет к тому, что все службы должны использовать кеш (минусы).
- Кэширование на уровне сервиса будет кэшироваться только для тех клиентов / сервисов, которые используют этот конкретный сервис и методы (Плюсы / Минусы?)
- Если у вас есть управление транзакциями на уровне сервиса, вам нужно быть осторожным при применении кэширования на уровне репозитория. Иногда операция чтения может попасть в кэш, и транзакция не может проверить, что считанные данные, для которых вы предполагаете выполнить операцию записи, не изменены.
Я бы пошел на кеширование на уровне сервиса. Если он более естественен и дает вам больше контроля над тем, где и когда вы хотите кэшировать. Уровень хранилища обычно низкозернистый. Уровень сервиса и его методы ближе к сценариям использования, и тогда вы знаете, когда и что кэшировать.
Я действительно рекомендую написать оболочку кеша, такую как
public class CacheManager : ICacheManager
{
public Address Address
{
get { }
set { }
}
}
Содержит статическую ссылку на System.Runtime.Caching.MemoryCache.Default.
Это делает ваш тип кэширования безопасным, а приведение в действие выполняется только внутри оболочки. Вы также можете выполнить модульное тестирование своих сервисов с помощью Mocked ICacheManager.
Более продвинутый подход заключается в том, чтобы сделать это с помощью Аспектно-ориентированного программирования и декораторов / перехватчиков. У вас есть масса полезной информации здесь, на StackOverFlow https://stackoverflow.com/search?q=AOP+caching