7

मेरी समाधान में परियोजनाओं को इस तरह से सेट हैं। डेटा, मैं अपने डेटा को रेपॉजिटरीज़ के समूह के साथ अमूर्त बातचीत के लिए एक्सेस करने के लिए एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं। स्पष्ट कारणों से, मैं अपनी ऐप को चाहता हूं। केवल ऐप। डेटा परियोजना को संदर्भित करने के लिए और इकाई फ्रेमवर्क नहीं।इंजेक्शन DbContext

मैं निर्माता इंजेक्शन का उपयोग कर रहा मेरी नियंत्रकों एक भंडार कंटेनर कि इस तरह दिखता है के लिए एक संदर्भ देने के लिए:

public interface IDataRepository 
{ 
    IUserRepository User { get; set; } 
    IProductRepository Product { get; set; } 

    // ... 
} 

public class DataRepository : IDataRepository 
{ 
    private readonly AppContext _context; 

    public DataRepository(AppContext context) 
    { 
     _context = context; 
    } 

    // ... 
} 

DataRepository एक AppContext वस्तु (जो इकाई की रूपरेखा के DbContext से विरासत) होगा कि सभी बच्चे डेटाबेस का उपयोग करने के लिए रिपोजिटरीज का उपयोग किया जाएगा।

तो अंत में हम अपनी समस्या पर आते हैं: मैं DataRepository पर कन्स्ट्रक्टर इंजेक्शन का उपयोग कैसे कर सकता हूं क्योंकि यह एक कोड लाइब्रेरी है और इसमें कोई प्रविष्टि-बिंदु नहीं है? मैं App.Web में AppContext बूटस्ट्रैप नहीं कर सकता क्योंकि तब मुझे उस प्रोजेक्ट से एंटीटी फ्रेमवर्क का संदर्भ देना होगा।

या क्या मैं बस कुछ बेवकूफ कर रहा हूं?

+0

नहीं अपने प्रश्न, लेकिन इसके बजाय भंडार इंटरफेस का एक बहुत को परिभाषित करने के लिए एक उत्तर, एक भी 'IRepository ' इंटरफेस को परिभाषित करने, के रूप में समझाया [यहां] की कोशिश (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92)। यह अधिक लचीलापन की अनुमति देता है। – Steven

+3

@Steven आपकी टिप्पणी के लिए धन्यवाद। मैं इस कारण से विशिष्ट भंडारों को प्राथमिकता देता हूं: "एक भंडार डोमेन का एक हिस्सा है, और यह डोमेन सामान्य नहीं है। प्रत्येक इकाई को हटाया नहीं जा सकता है, न कि प्रत्येक इकाई को जोड़ा जा सकता है, न कि प्रत्येक इकाई में एक भंडार होता है"। http://stackoverflow.com/questions/1230571/advantage-of-creating-a-generic-repository-vs- विशिष्ट- रेस्पिटरी-for-each-obje – ajbeaven

उत्तर

12

आप कक्षा App.Data में परिभाषित कर सकते हैं जो संदर्भ में एक रैपर के रूप में कार्य करता है और App.Web में ईएफ संदर्भित करने की आवश्यकता को हटा देता है। यदि आप आईओसी कंटेनर का उपयोग कर रहे हैं तो आप RepositoryConnection कक्षा के जीवनकाल को नियंत्रित कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि Repository के सभी उदाहरण समान संदर्भ प्राप्त करें। इस सरल उदाहरण है ...

public class RepositoryConnection 
{ 
    private readonly AppContext _context; 

    public RepositoryConnection() 
    { 
     _context = new AppContext(); 
    } 

    public AppContext AppContext { get { return _context; } } 
} 

public class DataRepository : IDataRepository 
{ 
    private readonly AppContext _context; 

    public DataRepository(RepositoryConnection connection) 
    { 
     _context = connection.AppContext; 
    } 

// ... 
} 
+0

बिल्कुल आह! इस आदमी को ऊपर उठाओ! – ajbeaven

+0

यदि सभी वर्गों को एक ही संदर्भ मिल रहा है, तो कोई भी ईएफ संदर्भ का निपटारा नहीं कर रहा है, जो कि बुरा है, बहुत बुरा है। ईएफ संदर्भ इस विचार के साथ डिजाइन किए गए हैं कि आप तत्काल, उपयोग और निपटान करते हैं। –

+0

@ ब्रूनोबेंट आप बिल्कुल सही हैं - एक 'संदर्भ' जितना संभव हो उतना छोटा होना चाहिए और यह उत्तर पूरी तरह से इसका समर्थन करता है। तथ्य यह है कि हमारे पास असेंबली के बीच 'पुल' के रूप में कार्य करने के लिए 'रिपोजिटरी कनेक्शन 'है, कुछ भी नहीं बदलता है। 'रिपोजिटरी कनेक्शन 'और इसलिए' संदर्भ 'पंजीकृत हैं ** प्रति वेब अनुरोध **। प्रत्येक 'रिपोजिटरी कनेक्शन' (और इसलिए 'संदर्भ') एक वेब अनुरोध के दायरे में मौजूद होगा और इसलिए सेकंड के मामले में जीवित रहेगा। जैसे ही वेब अनुरोध समाप्त हो गया है, डी प्रबंधित कक्षाएं गुंजाइश से बाहर हो जाएंगी और 'विस्थापित() 'हो जाएंगी। – qujck

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