Я использую новый 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
(который является статическим) и не заботится о управлении жизненным циклом для кэша.