Безопасность потоков и управление областью для .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 в будущем, тогда его легко настроить.

Надеюсь, это поможет!