Управление безопасностью потоков и областью действия для .NET 4.0 ObjectCache - PullRequest
14 голосов
/ 10 февраля 2011

Я использую новый .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.

Итак, вот что у меня есть, теперь вопросы:

  1. Если у меня есть класс для переноса ObjectCache, должен ли этот класс быть одноэлементным?
  2. MSDN говорит, что ObjectCache является потокобезопасным, но теперь, когда я использую одноэлементный, мне нужен какой-либо тип блокировки для обеспечения безопасности потока?
  3. Должен ли частный экземпляр ObjectCache в моем классе-обертке быть статическим?Должен ли сам класс быть статичным?
  4. Общие мысли о моей общей реализации?

Мне не удалось найти достойный блог / статью по .NET ObjectCache в ASP.NET веб-приложений, следовательно, моя путаница.

Я привык к использованию HttpContext.Current.Cache (что является статическим) и не заботится об управлении временем жизни для кэша.

1 Ответ

6 голосов
/ 15 февраля 2011
  1. Так как MemoryCache.Default является одиночным, ваш класс без сохранения состояния не обязательно должен быть им. Однако это полностью зависит от вас.
  2. Вам не нужно блокировать экземпляр ObjectCache.
  3. Нет, и нет. Делая это статичным, не дает никакого значения. Указание на то, что это одноэлементный объект в StructureMap, заставляет GetInstance<>() всегда возвращать один и тот же объект в любом случае.
  4. Реальным значением обтекания 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 в будущем, то это легко настроить.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...