Enterprise Library 5 имеет плавную конфигурацию , которая упрощает программную настройку блоков. Например:
var builder = new ConfigurationSourceBuilder();
builder.ConfigureCaching()
.ForCacheManagerNamed("MyCache")
.WithOptions
.UseAsDefaultCache()
.StoreInIsolatedStorage("MyStore")
.EncryptUsing.SymmetricEncryptionProviderNamed("MySymmetric");
var configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
EnterpriseLibraryContainer.Current
= EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
К сожалению, похоже, вам нужно настроить весь блок сразу, чтобы вы не смогли добавить CacheManager на лету. (Когда я дважды вызываю ConfigureCaching()
на одном и том же сборщике, возникает исключение.) Вы можете создать новый ConfigurationSource
, но тогда вы потеряете свою предыдущую конфигурацию. Возможно, есть способ получить существующую конфигурацию, изменить ее (например, добавить новую CacheManager
) и затем заменить ее? Я не смог найти способ.
Другой подход заключается в прямом использовании классов Caching
.
В следующем примере классы Caching
используются для создания двух экземпляров CacheManager
и сохранения их в статическом Dictionary
. Не требуется настройка, так как он не использует контейнер. Я не уверен, что это отличная идея - мне это кажется немного неправильным. Это довольно элементарно, но, надеюсь, поможет.
public static Dictionary<string, CacheManager> caches = new Dictionary<string, CacheManager>();
static void Main(string[] args)
{
IBackingStore backingStore = new NullBackingStore();
ICachingInstrumentationProvider instrProv = new CachingInstrumentationProvider("myInstance", false, false,
new NoPrefixNameFormatter());
Cache cache = new Cache(backingStore, instrProv);
BackgroundScheduler bgScheduler = new BackgroundScheduler(new ExpirationTask(null, instrProv), new ScavengerTask(0,
int.MaxValue, new NullCacheOperation(), instrProv), instrProv);
CacheManager cacheManager = new CacheManager(cache, bgScheduler, new ExpirationPollTimer(int.MaxValue));
cacheManager.Add("test1", "value1");
caches.Add("cache1", cacheManager);
cacheManager = new CacheManager(new Cache(backingStore, instrProv), bgScheduler, new ExpirationPollTimer(int.MaxValue));
cacheManager.Add("test2", "value2");
caches.Add("cache2", cacheManager);
Console.WriteLine(caches["cache1"].GetData("test1"));
Console.WriteLine(caches["cache2"].GetData("test2"));
}
public class NullCacheOperation : ICacheOperations
{
public int Count { get { return 0; } }
public Hashtable CurrentCacheState { get { return new System.Collections.Hashtable(); } }
public void RemoveItemFromCache(string key, CacheItemRemovedReason removalReason) {}
}
Если политики истечения срока действия и очистки совпадают, возможно, было бы лучше создать один CacheManager
, а затем использовать некоторые интеллектуальные имена ключей для представления различных «контейнеров». Например. имя ключа может иметь формат «{имя контейнера}: {ключ элемента}» (при условии, что двоеточие не будет отображаться в имени контейнера или ключа).