2009-06-24 9 views
29

प्रसंग: नेट 3.5, सी #
मैं अपने कंसोल आवेदन में कैशिंग तंत्र है करना चाहते हैं।
के बजाय फिर से खोज करने पहिया, मैं System.Web.Caching.Cache उपयोग करना चाहते हैं (और है कि अंतिम निर्णय है, मैं अन्य कैशिंग ढांचे का उपयोग नहीं कर सकते, मत पूछो क्यों)।
हालांकि, ऐसा लगता है कि System.Web.Caching.Cache केवल वैध HTTP संदर्भ में चलाना है। मेरे बहुत ही सरल स्निपेट ऐसा दिखता है:मैं कंसोल एप्लिकेशन में System.Web.Caching.Cache का उपयोग कैसे कर सकता हूं?

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); 
} 

और परिणाम है:

 
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() 

तो जाहिर है, मैंने कुछ गलत यहाँ कर रहा हूँ। कोई विचार?


अद्यतन: +1 सबसे उत्तर देने के लिए, स्थिर विधियों के माध्यम से कैश हो रही सही उपयोग, अर्थात् HttpRuntime.Cache और HttpContext.Current.Cache है। आप सभी को धन्यवाद!

उत्तर

56

कैश कन्स्ट्रक्टर के लिए प्रलेखन का कहना है कि यह केवल आंतरिक उपयोग के लिए है। अपने कैश ऑब्जेक्ट को प्राप्त करने के लिए, कन्स्ट्रक्टर के माध्यम से उदाहरण बनाने के बजाय HttpRuntime.Cache पर कॉल करें।

9

बस Caching Application Block उपयोग करें यदि आप पहिया बदलने की नहीं करना चाहती। यदि आप अभी भी एएसपी.NET कैश- see here का उपयोग करना चाहते हैं। मुझे पूरा यकीन है कि यह केवल .NET 2.0 और ऊपर के साथ काम करता है।

कैश श्रेणी नहीं है: यह बस 1.

MSDN भी कैश प्रलेखन के लिए पृष्ठ पर एक अच्छा बड़ा चेतावनी है .NET में ASP.NET के बाहर कैश का उपयोग करने के लिए संभव नहीं था के लिए एएसपी.NET अनुप्रयोगों के बाहर उपयोग करना है। यह बनाया गया है और ASP.NET में उपयोग के लिए परीक्षण किया वेब अनुप्रयोगों के लिए कैशिंग प्रदान करने के लिए किया गया था। अन्य प्रकार के अनुप्रयोगों जैसे कि कंसोल अनुप्रयोग या विंडोज फॉर्म अनुप्रयोगों में, एएसपी.नेट कैशिंग सही ढंग से काम नहीं कर सकता है।

बहुत हल्के समाधान के लिए, जहां आपको समाप्ति आदि के बारे में चिंता करने की आवश्यकता नहीं है, तो एक शब्दकोश वस्तु पर्याप्त हो सकती है।

+0

"यहाँ देखें" लिंक टूट गया है –

+0

@ Ron- कि एक Stackoverflow बग है। यहां एक ही लिंक के लिए एक 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 वर्ग अपने सदस्य "_cacheInternal" HttpRuntime वस्तु द्वारा निर्धारित होने पर निर्भर करता कोशिश करो।

System.Web.Caching कक्षाओं का उपयोग करने के लिए आपको एक HttpRuntime ऑब्जेक्ट बनाना होगा और HttpRuntime.Cache गुण सेट करना होगा। आपको प्रभावी ढंग से आईआईएस अनुकरण करना होगा।

आप जैसे अन्य कैशिंग चौखटे का उपयोग कर बेहतर कर रहे हैं:

+1

"इसे सेट करने का एकमात्र तरीका आंतरिक तरीकों के माध्यम से है" - सच नहीं, _cacheInternal स्थिर संपत्ति एक्सेसर HttpRuntime.Cache द्वारा सेट किया गया है। हालांकि, एमएसडीएन ने एएसपी.NET कैश की सिफारिश की है कि गैर-वेब ऐप्स में क्यों उपयोग नहीं किया जाना चाहिए, इस बारे में अधिक जानकारी में दिलचस्पी होगी। मेरे पास कोड है जो इसका उपयोग करता है (जो इस चेतावनी के अस्तित्व से पहले की तारीखें हैं), और यह ठीक लगता है * लगता है। – Joe

+0

धन्यवाद @ जो - मेरा जवाब संपादित किया गया – d4nt

4

मैं इस पेज को एक ही बात सोच रहा पर समाप्त हो गया। यहाँ मैं क्या कर रहा है (जो मुझे पसंद नहीं है लेकिन सिर्फ अच्छा काम करने लगता है) है:

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

यह बहुत गंदा है लेकिन यह वास्तव में काम में आया जब मेरे पास एक प्रोटोटाइप था जो बाहरी डेल के साथ एकीकृत था जो HttpContext.Current.Cache पर निर्भर था और मुझे बस इसे काम करने की आवश्यकता थी। मुझे यहां एक छोटा संस्करण मिला: http://caioproiete.net/en/fake-mock-httpcontext-without-any-special-mocking-framework/ – bygrace

28

जबकि ओपी निर्दिष्ट v3.5, सवाल से पहले v4 जारी किया गया था कहा गया था। इस प्रश्न को ढूंढने वाले किसी भी व्यक्ति की सहायता के लिए और एक v4 निर्भरता के साथ रह सकते हैं, फ्रेमवर्क टीम ने इस प्रकार के परिदृश्य के लिए एक नया सामान्य उद्देश्य कैश बनाया है। यह System.Runtime.Caching नाम स्थान में है: http://msdn.microsoft.com/en-us/library/dd997357%28v=VS.100%29.aspx

डिफ़ॉल्ट संचय उदाहरण के लिए स्थिर संदर्भ है: MemoryCache.Default

+0

टिप के लिए धन्यवाद! –

+3

बहुत उपयोगी! मैं इसके बजाय इस नए दृष्टिकोण का उपयोग करने के लिए अपने वेबपैप में कॉल स्विच कर रहा हूं। अब उन विधियों को HttpContext.Cache को परिभाषित करने के बिना यूनिट परीक्षण किया जा सकता है। :) – ClearCloud8

संबंधित मुद्दे

 संबंधित मुद्दे