2013-01-17 37 views
5

मेरे पास मेरे एप्लिकेशन में कुछ "कैशिंग" ऑब्जेक्ट हैं, जो निर्भरता इंजेक्शन (निनजेक्ट) द्वारा IRepository (कस्टम रिपोजिटरी पैटर्न अनुबंध) प्राप्त करते हैं। वे ऑब्जेक्ट्स केवल एक बार भंडार का उपयोग करते हैं, लेकिन उनके पास एक ताज़ा फ़ंक्शन है जो मालिक को खुद को ताज़ा करने के लिए मजबूर करता है। वे एकल हैं, केवल एक बार बनाए जाते हैं, और ManualResetEvent यह सुनिश्चित करता है कि सभी अनुरोध लोड होने तक अवरुद्ध हो जाएं।सिंगलेट्स में डेटा कनेक्शन के निर्भरता इंजेक्शन के लिए सर्वश्रेष्ठ दृष्टिकोण

IRepositories हैं एफई CodeFirst आधारित, तो यह ठीक है बस सुनिश्चित कनेक्शन बंद कर दिया है और वहाँ DbContext हमेशा के संदर्भ में रखने के लिए?

मैंने प्रॉक्सी और आलसी लोडिंग को अक्षम कर दिया है, तो ... कैशिंग ऑब्जेक्ट की जड़ों से सैकड़ों इन कैश किए गए पॉको इकाइयों में लंबे संदर्भ होने के लिए ठीक है?

चीयर्स।

उत्तर

0

अंत में सबसे अच्छा समाधान मैंने पाया आवरण एक नई तरह की बनाने के लिए है

// Dependency Injection bindings declaration section 
DI.Bind<Generator<IRepository>>() 
    .To(()=> new Generator<IRepository>(()=> DI.Get<IRepository>())); 

इसलिए लंबे समय तक रहते थे वस्तुओं में, कि तत्व बनाने और नष्ट करने की आवश्यकता है, मैं IRepository की बजाय Generator<IRepository> सेवा के लिए पूछ सकता हूं। इसलिए, हर बार जब मैं ताज़ा करने की आवश्यकता है, मैं बस एक नई IRepository बनाना होगा, यह जानकर कि यह कैसे हुड के नीचे का निर्माण कर रहा है बिना:

using (var repository = repositoryGenerator.Generate()) 
{ 
    repository.DoStuff(); 
} 

यह अब तक एक आकर्षण की तरह काम करता है।

दरअसल, मैंने इस सुविधा को मेरे डी ढांचे में जोड़ा है। अब मैं जेनरेटर के लिए अनुरोध पर और बाद में बाध्य कर सकता हूं, और ढांचा मुझे इस तकनीक का उपयोग कर पूरी तरह तैयार वस्तु देगा How to create a Func<> delegate programmatically

चीयर्स।

2

हम जूली Lerman की टिप्पणियों को संदर्भ, http://msdn.microsoft.com/en-us/magazine/ee532098.aspx?sdmr=JulieLerman सिफारिश कई/कई छोटे संदर्भों है और वेब परिदृश्यों के मामले में एक नया संदर्भ प्रत्येक कॉल पैदा करते हैं। हालांकि वह एंटीटी फ्रेमवर्क और ऐपफैब्रिक में द्वितीय स्तर के कैशिंग के बारे में लिखती है।

समय के साथ, संदर्भ में कई ऑब्जेक्ट्स होंगे और प्रदर्शन तदनुसार घट जाएगा। मुझे लगता है कि इस साइट पर ईएफ प्रदर्शन पर कुछ अच्छी युक्तियां हैं। जैसे उत्पन्न विचार। http://msdn.microsoft.com/en-us/data/hh949853

मेरी व्यक्तिगत सिफारिश, कि मैं दावा नहीं कर सकता कि सबसे अच्छा अभ्यास है, लेकिन किसी ऐसे व्यक्ति से जो प्रदर्शन के बारे में चिंतित है, वह छोटा बाध्य संदर्भ है प्रत्येक कॉल एक ठोस दीर्घकालिक समझौता है। शुरुआती लोड समय को यथासंभव छोटा रखने के लिए जेनरेट किए गए दृश्यों का उपयोग करें।

आप संदर्भ से अप्रयुक्त वस्तुओं को छोड़ने के लिए संभावित रूप से स्थायी डीबीसीएन्टेक्स्ट प्रबंधित कर सकते हैं। या ऐसा करने के लिए घटनाओं के साथ एक कैशिंग पुस्तकालय का उपयोग करें। एक छोटा सा काम नहीं।

मुझे आपके द्वारा चुने गए समाधान में दिलचस्पी होगी। कृपया पोस्ट करें।

public class Generator<T> where T : IDisposable 
    { 
     readonly Func<T> _generate; 
     public Generator(Func<T> generate) 
     { 
      _generate= generate; 
     } 

     public T Generate() 
     { 
      return _generate(); 
     } 
    } 

एक बाध्यकारी और अधिक या कम इस तरह से और बनाने के लिए::

+0

धन्यवाद।मैं आपको बता दूंगा :) – vtortola