2009-06-24 62 views
29

Bağlam: Net 3.5, C#
Benim konsol uygulamasında önbelleğe alma mekanizmasına sahip istiyorum.
yerine Tekerleği yeniden keşfetmekten, ben System.Web.Caching.Cache kullanmak istiyorum (ve ben neden diye sorma, diğer önbelleğe alma çerçevesini kullanamaz, nihai bir karar var).
Ancak, System.Web.Caching.Cache'un yalnızca geçerli bir HTTP bağlamında çalıştırılması gerektiği anlaşılıyor.Bir Console uygulamasında System.Web.Caching.Cache'yi nasıl kullanabilirim?

using System; 
using System.Web.Caching; 
using System.Web; 

Cache c = new Cache(); 

try 
{ 
    c.Insert("a", 123); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine("cannot insert to cache, exception:"); 
    Console.WriteLine(ex); 
} 

ve sonucudur: My çok basit pasajı şöyle

 
cannot insert to cache, exception: 
System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.Web.Caching.Cache.Insert(String key, Object value) 
    at MyClass.RunSnippet() 

Yani açıkçası, ben burada yanlış bir şey yapıyorum. Herhangi bir fikir?


Güncelleme: 1 En cevaplara, statik yöntemlerle önbelleği alma yani HttpRuntime.Cache ve HttpContext.Current.Cache doğru kullanımıdır. Hepinize teşekkür ederim! Tekerleği yeniden icat etmek istemiyorsanız

cevap

56

Önbellek yapıcısı belgeleri yalnızca dahili kullanım için olduğunu söylüyor. Önbellek nesnesini almak için, kurucu aracılığıyla bir örnek oluşturmak yerine HttpRuntime.Cache dosyasını arayın.

9

Sadece Caching Application Block kullanın. Hala ASP.NET önbelleğini kullanmak istiyorsanız see here. Eminim bu sadece .NET 2.0 ve üstü ile çalışıyor.

Önbellek sınıf değil: 1.

MSDN de önbellek dokümantasyon için sayfada bir güzel büyük uyarı vardır sadece .NET ASP.NET dışında önbelleği kullanmak mümkün değildi ASP.NET uygulamalarının dışında kullanım için tasarlanmıştır. Web uygulamaları için önbellek sağlamak üzere ASP.NET'te kullanılmak üzere tasarlanmış ve test edilmiştir. Böyle konsol uygulamalar veya Windows Forms uygulamaları olarak uygulamalar, diğer türleri, ASP.NET önbelleğe alma düzgün çalışmayabilir.

Son kullanma hakkında endişelenmenize gerek olmayan çok hafif bir çözüm için bir sözlük nesnesi yeterli olabilir.

+0

"Burada bkz" bağlantı Stackoverflow böcek Ron- @ –

+0

bozuldu. İşte aynı bağlantı için bir TinyUrl - http://tinyurl.com/ms35eu – RichardOD

1

public class AspnetDataCache : IDataCache 
{ 
    private readonly Cache _cache; 

    public AspnetDataCache(Cache cache) 
    { 
     _cache = cache; 
    } 

    public AspnetDataCache() 
     : this(HttpRuntime.Cache) 
    { 

    } 
    public void Put(string key, object obj, TimeSpan expireNext) 
    { 
     if (key == null || obj == null) 
      return; 
     _cache.Insert(key, obj, null, DateTime.Now.Add(expireNext), TimeSpan.Zero); 
    } 

    public object Get(string key) 
    { 
     return _cache.Get(key); 
    } 

1

System.Web.Caching.Cache sınıf http çalışma zamanı nesnesi tarafından belirlenen kendi üyesini "_cacheInternal" sahip dayanır deneyin.

bir http çalışma zamanı nesnesi ve kurulumu HttpRuntime.Cache özelliği oluşturmak için System.Web.Caching sınıfları sen olurdu kullanın. IIS'yi etkili bir şekilde taklit etmeniz gerekir.

Sen gibi diğer önbelleğe alma çerçeveler kullanarak daha iyi olur:

+1

"Bunu iç yöntemlerle ayarlamanın tek yolu" - doğru değil, _cacheInternal HttpRuntime.Cache statik özellik erişimcisi tarafından ayarlanır. Bununla birlikte, MSDN'in ASP.NET Önbelleği'nin non-non web uygulamalarında kullanılmasını önermesi konusunda daha fazla bilgi edinmek istiyorum. Bunu kullanan bir kodum var (bu uyarının varlığından önceye dayanıyor) ve * işe yaramayacak gibi görünüyor. – Joe

+0

Teşekkürler @Joe - benim düzenlediğim cevabı – d4nt

4

Ben de aynı şeyi merak bu sayfada sona erdi. Burada (Sevmediğim hangi ama sadece iyi iş gibi görünüyor) ne yapıyorum:

HttpContext context = HttpContext.Current; 
if (context == null) 
{ 
    HttpRequest request = new HttpRequest(string.Empty, "http://tempuri.org", string.Empty); 
    HttpResponse response = new HttpResponse(new StreamWriter(new MemoryStream())); 
    context = new HttpContext(request, response); 
    HttpContext.Current = context; 
} 
this.cache = context.Cache; 
+1

Bu çok kirli ama HttpContext.Current.Cache 'ye güvenen bir harici dll ile entegre edilmiş bir prototip olduğunda gerçekten işe yaradı ve sadece işe ihtiyacım vardı. Burada daha kısa bir versiyon buldum: http://caioproiete.net/en/fake-mock-httpcontext-without-any-special-mocking-framework/ – bygrace

28

v4 yayınlanmadan önce OP belirtilen v3.5 iken, soru soruldu. Bu soruyu ve bulan herkesin bir v4 bağımlılığı ile yaşayabileceği şekilde yardımcı olması için, çerçeve ekibi bu tür bir senaryo için yeni bir genel amaçlı önbellek oluşturdu. Bu System.Runtime.Caching ad alanında var: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

varsayılan önbellek örneğine statik referanstır: MemoryCache.Default

+0

Bahşiş için teşekkürler! –

+3

Çok faydalı! Bu yeni yaklaşımı kullanmak için webapp'ımdaki aramaları değiştiriyorum. Şimdi bu yöntemler tanımlanması için HttpContext.Cache gerek kalmadan birim test edilebilir. :) – ClearCloud8

İlgili konular