2011-02-09 27 views
14

Yeni .NET 4.0 Önbelleğe Alma API'si, ObjectCache kullanıyorum. Son birkaç gündür bu konuyla ilgili birkaç soru sordum ve bu konuya işaret ettim - ama bunun kendi sorusuyla çözülmesine değer olduğunu düşündüm.İş parçacığı .NET 4.0 için Güvenlik ve Kapsam Yönetimi ObjectCache

Sınıf soyut ve tüm yöntemler sanal olduğundan, bu kendi özel önbellek sağlayıcılarımızı oluşturabileceğimiz anlamına gelir.

MSDN'e göre, ObjectCache'un tekil olması gerekmez ve uygulamanızda birden fazla örnek oluşturabilirsiniz.

Ama benim için, bu, aynı zamanda bu nesnenin gerçekleşme ve yaşam süresini yönetmemiz gerektiği gibi geliyor?

Benim bağımlılık enjeksiyon kabı olarak StructureMap ile bir ASP.NET MVC 3 Web Uygulaması var.

Tüm web uygulamam için tek bir paylaşılan önbellek istiyorum.

ObjectCache sınıfını tamamlayan ve yöntemler uygulamasındaki kutucuklamayı sağlayan çok basit bir sınıf oluşturuyorum.

sınıf ctor içinde ObjectCache bir örneğini alır ve yöntemler kapalı çalışma (Get, vs ekle) önbelleği, bir özel statik örneğine bu ayarlar. ingilizce olarak

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

:

Ör Şimdi

public class CacheManager 
{ 
    private static ObjectCache _cache; 

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

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

, burada benim DI kayıt kapılan bir şey CacheManager örneği istediğinde , bir tekil örneğini kullanın ve bir olmak ObjectCache parametresini ayarlamak MemoryCache örneği. i ObjectCache sarmak için bir sınıf varsa,

  1. bu sınıf bir tekil olması gerekir kapsamaz:

    Yani ben, şimdi soruları ne var?

  2. MSDN, ObjectCache numaralı iş parçacığı için güvenli olduğunu söylüyor, ancak şimdi ben bir singleton kullanıyorum, iş parçacığı güvenliğini korumak için herhangi bir kilitleme türüne ihtiyacım var mı?
  3. Sarıcı sınıfımdaki ObjectCache özel örneğinin statik olması gerekiyor mu? Sınıfın kendisi statik mi olmalı?
  4. Genel uygulamamla ilgili genel düşünceler?

ASP.NET Web Uygulamalarında .NET ObjectCache'de iyi bir blog/makale bulamadım, dolayısıyla karışıklığım.

HttpContext.Current.Cache (statik olan) kullanıyorum ve önbellek için ömür boyu yönetim umurumda değil. MemoryCache.Default yana

cevap

6
  1. bir tekil olduğu, sizin vatansız sınıf gerçekten biri olmak gerekmez. Ancak, bu tamamen size kalmış.
  2. ObjectCache örneğinin etrafında kilitlenmesine gerek yoktur.
  3. Hayır ve Hayır Statik hale getirmek herhangi bir değer sağlamaz. StructureMap içinde bir tekil olduğunu belirten GetInstance<>() her zaman aynı nesneyi yine de döndürür.
  4. ObjectCache sargısının gerçek değeri önbellek uygulamasının soyut olması, böylece onu değiştirebilmeniz veya atabilmenizdir. Bir arayüz olmadan bu daha az kullanışlı hale gelir.

    For<ICacheManager>() 
        .Singleton() 
        .Use<CacheManager>(); 
    
    For<ObjectCache>() 
        .Use(MemoryCache.Default); 
    

    size hala gelecekte ObjectCache olan önbellek sağlayıcı değiştirmek istiyorsanız, o zaman var

aşağıda bir örnek uygulama ... Sonra

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

... ayarlanması kolaydır.

Umarım bu yardımcı olur!

+0

Aradığım cevap bu. Teşekkürler. Bu arada - 'MemoryCache.Default' bir singleton olduğunu düşündüren nedir? – RPM1984

+0

Ve ayrıca, normalde bir arabirim kullanacağım, ancak 'ObjectCache' türü benim arayüzüm, bu da soyut bir sınıf. Yani başka bir önbellek sağlayıcısına geçmek isterim, sadece ne tür ObjectCache'in CacheManager sınıfının ctoruna enjekte edildiğini değiştiriyorum. – RPM1984

+0

@Travis - Yukarıdaki herhangi bir yorum var mı? – RPM1984

İlgili konular