Я использую новый .NET 4.0 Caching API, ObjectCache .За последние несколько дней я задал несколько вопросов по этой области, и я намекнул на эту проблему - но подумал, что стоит разбить ее на собственный вопрос.
Поскольку класс абстрактный и всеметоды являются виртуальными, это означает, что мы можем создавать наших собственных провайдеров кэширования.
Согласно MSDN, ObjectCache
не обязательно должен быть одиночным, и вы можете создать несколько его экземпляров в своем приложении.
Но для меня это звучит так, как будто нам нужно управлять созданием экземпляра и временем жизни этого объекта?
У меня есть веб-приложение ASP.NET MVC 3, с StructureMap как мой контейнер для внедрения зависимостей.
Я хочу иметь один общий кэш для всего моего веб-приложения.
Итак, я создаю очень простой класс, который охватывает класс ObjectCache
,и обеспечивает распаковку в реализации методов.
Класс берет экземпляр ObjectCache
в ctor и устанавливает для него частный статический экземпляр кэша, с которым работают методы (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, используйте одноэлементный экземпляр,и установите параметр ObjectCache в качестве экземпляра MemoryCache.
Итак, вот что у меня есть, теперь вопросы:
- Если у меня есть класс для переноса
ObjectCache
, должен ли этот класс быть одноэлементным? - MSDN говорит, что
ObjectCache
является потокобезопасным, но теперь, когда я использую одноэлементный, мне нужен какой-либо тип блокировки для обеспечения безопасности потока? - Должен ли частный экземпляр
ObjectCache
в моем классе-обертке быть статическим?Должен ли сам класс быть статичным? - Общие мысли о моей общей реализации?
Мне не удалось найти достойный блог / статью по .NET ObjectCache в ASP.NET веб-приложений, следовательно, моя путаница.
Я привык к использованию HttpContext.Current.Cache
(что является статическим) и не заботится об управлении временем жизни для кэша.