Поменять репозитории с флагом - PullRequest
2 голосов
/ 03 июня 2011

У меня есть интерфейс IRepository со многими T и несколькими реализациями (БД по требованию, веб-сервис и т. Д.).Я использую AutoFac для регистрации IRepository для многих T, в зависимости от типа репозитория, который я хочу для каждого T.

У меня также есть реализация на основе .NET-кэширования, которая ищет T в кеше и затем вызывает'IRepository.Find для устранения ошибки кэша.Он построен примерно так:

new CachingRepository(realRepository, cacheImplementation);

Я хотел бы использовать флаг конфигурации, чтобы решить, обслуживает ли AutoFac основанный на кэшировании IRepository или «реальные вещи».Похоже, что realRepository возникает из-за того, что AutoFac запрашивает разрешение IRepository , но что получают клиенты, когда просят разрешить тот же интерфейс?Я хочу, чтобы они получили CachingRepository, если установлен флаг.

Я не могу понять, как реализовать это разрешение на основе флагов.Есть идеи?

1 Ответ

5 голосов
/ 03 июня 2011

Простейший вариант: делегат с условной регистрацией

Существует несколько способов сделать это.Использование настроек кэша в делегате регистрации, вероятно, является самым простым (и иллюстрирует силу регистрации делегатов):

var builder = new ContainerBuilder();

bool cache = GetCacheConfigSetting(); //Up to you where this setting is.    

builder.Register(c => cache ? (IRepository<string>)new CachingRepository<string>(new RealRepos<string>(), new CacheImpl()) : new RealRepos<string>());

Приведенный выше код будет считывать конфигурацию кэша только один раз.Вы также можете включить GetCacheConfigSetting() в регистрационный делегат.Это приведет к тому, что настройка будет проверяться на каждом Resolve (при условии InstancePerDependency).

Другие параметры: Autofac-декораторы и модули

Есть некоторые более продвинутыефункции Autofac, которые вы также можете найти полезными.Класс кеша в вашем вопросе является примером Pattern Decorator . Autofac имеет явную поддержку декораторов .У него также есть хорошая модель для структурирования ваших регистраций и управления конфигурационной информацией, которая называется Modules .

.
...