Безопасность потоков и управление областью для .NET 4.0 ObjectCache
Я использую новый API кэширования .NET 4.0, ObjectCache. Я задал несколько вопросов в этой области за последние несколько дней, и я намекнул на эту проблему, но подумал, что стоит разбить ее на собственный вопрос.
Поскольку класс является абстрактным и все методы являются виртуальными, это означает, что мы можем создавать собственные собственные поставщики кэша.
В соответствии с MSDN, ObjectCache
не должен быть одиночным, и вы можете создать несколько экземпляров в своем приложении.
Но для меня это похоже на то, что нам нужно управлять конкретизацией и временем жизни этого объекта?
У меня есть веб-приложение ASP.NET MVC 3 с StructureMap в качестве контейнера для инъекций зависимостей.
Я хочу иметь один общий кэш для всего веб-приложения.
Итак, я создаю очень простой класс, который обертывает класс ObjectCache
и предоставляет распаковку в реализации методов.
Класс принимает экземпляр ObjectCache
в ctor и устанавливает его в экземпляр private static кэша, который отключает методы (Add, Get и т.д.).
например
public class CacheManager
{
private static ObjectCache _cache;
public CacheManager(ObjectCache cache)
{
_cache = cache;
}
// Add, Get, Remove methods work off _cache instance.
}
Теперь, здесь мой реестр DI:
For<CacheManager>().Singleton().Use<CacheManager>().Ctor<ObjectCache>("cache").Is(MemoryCache.Default);
По-английски: Когда что-то запрашивает экземпляр CacheManager, используйте экземпляр singleton и задайте параметр ObjectCache как экземпляр MemoryCache.
Итак, что у меня есть, теперь вопросы:
- Если у меня есть класс для обертывания
ObjectCache
, должен ли этот класс быть одиночным?
- MSDN говорит, что
ObjectCache
является потокобезопасным, но теперь, когда я использую singleton, мне нужен какой-либо блокировки для обеспечения безопасности потока?
- Является ли частный экземпляр
ObjectCache
в моем классе-оболочке статическим? Должен ли сам класс быть статическим?
- Общие мысли о моей общей реализации?
Мне не удалось найти достойный блог/статью о .NET ObjectCache в веб-приложениях ASP.NET, отсюда и моя путаница.
Я использую HttpContext.Current.Cache
(который является статическим) и не заботится о управлении жизненным циклом для кэша.
Ответы
Ответ 1
- Так как
MemoryCache.Default
является одноэлементным, ваш класс без сохранения состояния не обязательно должен быть одним. Тем не менее, это полностью зависит от вас.
- Вам не нужно блокировать экземпляр объекта ObjectCache.
- Нет, и Нет. Создание статического значения не дает никакой ценности. Указывая, что singleton в StructureMap делает
GetInstance<>()
, всегда возвращает тот же самый объект.
- Реальное значение wrapping
ObjectCache
было бы абстрактной реализацией кэша, поэтому вы можете изменить его или высмеять. Без интерфейса это становится менее полезным.
Пример реализации ниже...
public interface ICacheManager
{
// add, get, remove, etc
}
public class CacheManager : ICacheManager
{
private static ObjectCache _cache;
public CacheManager(ObjectCache cache)
{
_cache = cache;
}
// Add, Get, Remove methods work off _cache instance.
}
Тогда...
For<ICacheManager>()
.Singleton()
.Use<CacheManager>();
For<ObjectCache>()
.Use(MemoryCache.Default);
Если вы хотите изменить поставщика кэшей, который по-прежнему остается ObjectCache
в будущем, тогда его легко настроить.
Надеюсь, это поможет!