2011-02-09 11 views
14

Używam nowego interfejsu API do buforowania .NET 4.0, ObjectCache. Zadałem kilka pytań na ten temat w ciągu ostatnich kilku dni, a ja zasugerowałem tę kwestię - ale pomyślałem, że warto ją podzielić na własne pytanie.Zarządzanie bezpieczeństwem wątków i zakresów dla obiektów .NET 4.0 ObjectCache

Ponieważ zajęcia są abstrakcyjne, a wszystkie metody są wirtualne, oznacza to, że możemy tworzyć własnych niestandardowych dostawców pamięci podręcznej.

Zgodnie z MSDN, ObjectCache nie musi być pojedynczym, a możesz utworzyć wiele jego wystąpień w swojej aplikacji.

Ale dla mnie brzmi to tak, jakbyśmy musieli zarządzać instancją i czasem życia tego obiektu?

Mam aplikację sieci Web ASP.NET MVC 3, z StructureMap jako mój kontener wstrzykiwania zależności.

Chcę mieć jedną, współużytkowaną pamięć podręczną dla całej mojej aplikacji internetowej.

Tworzę więc bardzo prostą klasę, która otula klasę ObjectCache i zapewnia rozpakowanie w implementacji metod.

Klasa trwa wystąpienie ObjectCache w ctor i ustawia to do private static instancji cache, które metody (dodawanie, Get, etc) odpracować.

Np

public class CacheManager 
{ 
    private static ObjectCache _cache; 

    public CacheManager(ObjectCache cache) 
    { 
     _cache = cache; 
    } 

    // Add, Get, Remove methods work off _cache instance. 
} 

A oto mój rejestru DI:

For<CacheManager>().Singleton().Use<CacheManager>().Ctor<ObjectCache>("cache").Is(MemoryCache.Default); 

w języku angielskim: Kiedy coś prosi instancję CacheManager używać singleton instancji i ustaw parametr ObjectCache być Instancja MemoryCache.

Więc co mam, teraz pytania:

  1. Jeśli mam klasę zawinąć ObjectCache, czy ta klasa musi być pojedyncza?
  2. MSDN mówi, że ObjectCache jest bezpieczny dla wątków, ale teraz, gdy używam singletonu, czy potrzebuję jakiegokolwiek rodzaju blokady, aby zachować bezpieczeństwo nici?
  3. Czy prywatna instancja ObjectCache w mojej klasie opakowania musi być statyczna? Czy sama klasa musi być statyczna?
  4. Ogólne uwagi na temat mojej ogólnej implementacji?

Nie znalazłem przyzwoitego bloga/artykułu na temat .NET ObjectCache w aplikacjach ASP.NET, stąd moje zamieszanie.

Używam do używania HttpContext.Current.Cache (co jest statyczne) i nie dbam o zarządzanie pamięcią podręczną przez całe życie.

Odpowiedz

6
  1. Ponieważ MemoryCache.Default jest singletonem, twoja klasa bez statu nie musi tak naprawdę być. Jednak to zależy od Ciebie.
  2. Nie trzeba blokować wokół instancji ObjectCache.
  3. Nie, i Nie. Uczynienie statycznym nie zapewnia żadnej wartości. Wskazanie, że jest to singleton w StructureMap, powoduje, że GetInstance<>() zawsze zwraca ten sam obiekt.
  4. Prawdziwą wartością zawijania ObjectCache będzie abstrakcyjna implementacja pamięci podręcznej, aby można było ją zmienić lub kpić. Bez interfejsu staje się mniej użyteczny.

Przykładem wdrożenia poniżej ...

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. 
} 

Potem ...

For<ICacheManager>() 
    .Singleton() 
    .Use<CacheManager>(); 

For<ObjectCache>() 
    .Use(MemoryCache.Default); 

Jeśli chcesz zmienić się z operatorem cache, który jest wciąż ObjectCache w przyszłości, to jest to łatwe do dostosowania.

Mam nadzieję, że to pomoże!

+0

Oto odpowiedź, której szukałem. Dzięki. A propos - co sprawia, że ​​'MemoryCache.Default' jest singletonem? – RPM1984

+0

A także, normalnie używałbym interfejsu, ale typem "ObjectCache" jest mój interfejs, ponieważ jest to klasa abstrakcyjna. Więc jeśli chcę przejść do innego dostawcy pamięci podręcznej, po prostu zmieniam typ "ObjectCache", który zostanie wstrzyknięty do ctor klasy CacheManager. – RPM1984

+0

@Travis - jakiekolwiek uwagi do powyższego? – RPM1984