2011-02-09 11 views
14

के लिए थ्रेड सुरक्षा और स्कोप प्रबंधन मैं नया .NET 4.0 कैशिंग API, ObjectCache का उपयोग कर रहा हूं। मैं पिछले कुछ दिनों से इस क्षेत्र पर कुछ सवाल पूछा है, और मैं इस मुद्दे पर संकेत दिया गया है - लेकिन सोचा था कि यह उसके अपने प्रश्न में यह बाहर तोड़ लाभदायक है।.NET 4.0 ऑब्जेक्ट कैश

क्योंकि कक्षा सार है और सभी विधियां आभासी हैं, इसका मतलब है कि हम अपना खुद का कस्टम कैश प्रदाता बना सकते हैं।

एमएसडीएन के अनुसार, ObjectCache को सिंगलटन नहीं होना चाहिए, और आप अपने आवेदन में इसके कई उदाहरण बना सकते हैं।

लेकिन मेरे लिए ऐसा लगता है कि हमें इस वस्तु के तत्काल और जीवनकाल को भी प्रबंधित करने की आवश्यकता है?

मेरे पास एक निर्भरता इंजेक्शन कंटेनर के रूप में StructureMap के साथ एक एएसपी.नेट एमवीसी 3 वेब अनुप्रयोग है।

मैं अपने पूरे वेब आवेदन के लिए एक एकल, साझा कैश करना चाहते हैं।

तो, मैं एक बहुत ही सरल वर्ग बनाता हूं जो ObjectCache कक्षा को लपेटता है, और विधियों के कार्यान्वयन में अनबॉक्सिंग प्रदान करता है।

वर्ग ctor में ObjectCache का एक उदाहरण लेता है, और एक निजी स्थिर कैश है, जो विधि (जोड़े, जाओ, आदि) से दूर काम के कहने को यह तय करता है।

जैसे

public class CacheManager 
{ 
    private static ObjectCache _cache; 

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

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

अब, यहाँ मेरी डि रजिस्ट्री है:

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

अंग्रेज़ी में: जब कुछ एक CacheManager उदाहरण अनुरोध करता है, एक सिंगलटन उदाहरण का उपयोग, और ObjectCache पैरामीटर सेट एक होने के लिए MemoryCache उदाहरण।

  1. तो मैं एक वर्ग ObjectCache रैप करने के लिए है, इस वर्ग के एक सिंगलटन होने की जरूरत है:

    तो वहाँ मैं क्या है, अब सवाल है?

  2. एमएसडीएन का कहना है कि ObjectCache थ्रेड-सुरक्षित है, लेकिन अब जब मैं एक सिंगलटन का उपयोग कर रहा हूं, क्या मुझे थ्रेड सुरक्षा रखने के लिए किसी भी प्रकार की लॉकिंग की आवश्यकता है?
  3. क्या मेरे रैपर वर्ग में ObjectCache का निजी उदाहरण स्थिर होना चाहिए? वर्ग खुद को स्थिर करने की आवश्यकता है?
  4. मेरी कुल कार्यान्वयन पर सामान्य विचार?

मैं ASP.NET वेब अनुप्रयोगों में नेट ObjectCache पर एक सभ्य ब्लॉग/लेख ढूँढने में सक्षम मेरी भ्रम नहीं किया गया है, इसलिए।

मैं HttpContext.Current.Cache (जो स्थैतिक है) का उपयोग करने के लिए उपयोग किया जाता है और कैश के लिए आजीवन प्रबंधन की परवाह नहीं करता है।

उत्तर

6
  1. MemoryCache.Default के बाद से एक सिंगलटन है, अपने राज्यविहीन वर्ग वास्तव में एक होने की जरूरत नहीं है। हालांकि, यह पूरी तरह से आप पर निर्भर है।
  2. आपको ऑब्जेक्ट कैश उदाहरण के आसपास लॉकिंग की आवश्यकता नहीं है।
  3. नहीं, और नहीं। यह स्थिर बनाना कोई मूल्य प्रदान नहीं करता है। यह इंगित करता है कि यह स्ट्रक्चर मैप में एक सिंगलटन बनाता है 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 है कि बदलना चाहते हैं, तो यह है समायोजित करने के लिए आसान है।

मुझे आशा है कि इससे मदद मिलती है!

+0

यही वह उत्तर है जिसे मैं ढूंढ रहा था। धन्यवाद। वैसे - आपको क्या लगता है कि 'MemoryCache.Default' एक सिंगलटन है? – RPM1984

+0

और सामान्य रूप से, मैं एक इंटरफ़ेस का उपयोग करता हूं, लेकिन 'ऑब्जेक्ट कैश' प्रकार का मेरा इंटरफ़ेस है, जिसमें यह एक अमूर्त वर्ग है। तो अगर मैं किसी अन्य कैश प्रदाता पर फ़्लिक करना चाहता हूं, तो मैं केवल कैशमेनगर वर्ग के सीटीआर में किस प्रकार के 'ऑब्जेक्ट कैश' को इंजेक्शन देता हूं, बदलता हूं। – RPM1984

+0

@Travis - उपरोक्त को कोई टिप्पणी? – RPM1984