2009-07-08 15 views
5

के साथ रिपोजिटरी पैटर्न .NET 1.1 (C#) के साथ रिपोजिटरी पैटर्न का उपयोग करने के लिए एक सामान्य दृष्टिकोण क्या है?.NET 1.1

मैं this Stack Overflow question की लाइनों के साथ कुछ ढूंढ रहा हूं, सिवाय इसके कि .NET 1.1 में, मेरे पास जेनेरिक नहीं है, इसलिए मैं यह देखने के लिए देख रहा हूं कि यह संभव है (मुझे यकीन है कि यह है) और यह आमतौर पर कैसे किया जाता है।

उत्तर

1

यह बहुत संभव है लेकिन आपको या तो एक सामान्य इंटरफ़ेस का उपयोग नहीं करना है या बहुत सारे कास्टिंग नहीं करना है। एक इंटरफ़ेस का उपयोग करना ...

public interface IRepository 
{ 
    public object Get(int id); // or object id 
    public void Save(object obj); 
} 

public class CustomerRepository : IRepository 
{ 
    public object Get(int id) { // implementation } 
    public void Save(object obj) { // implementation } 
} 

यह ठीक काम करता है लेकिन बुला कोड ठोस कार्यान्वयन में सही प्रकार पर वस्तुओं और तरीकों कास्ट करने के लिए है प्रकार की जांच और अपवादों फेंक करने के लिए है। डायरेक्ट कास्टिंग रनटाइम अपवादों के लिए पूछ रहा है इसलिए मैं इस दृष्टिकोण से बचूंगा।

जिस दृष्टिकोण का मैं अनुशंसा करता हूं वह यह नहीं है कि आपके रिपॉजिटरीज़ एक सामान्य इंटरफेस को लागू न करें। इसके बजाय उन्हें आम तौर पर सम्मेलन द्वारा नामित विधियों को लागू करना है।

public class CustomerRepository 
{ 
    public Customer Get(int id) { // implementation } 
    public void Save(Customer entity) { // implementation } 
} 

public class EmployeeRepository 
{ 
    public Employee Get(int id) { // implementation } 
    public void Save(Employee entity) { // implementation } 
} 

जोड़ने के लिए संपादित: मैं लिंक किए गए उत्तर को दोबारा पढ़ता हूं। अंतिम पूर्ण पैराग्राफ मुझे खो देता है लेकिन मैं DI का उपयोग करने पर थोड़ा सा विस्तार कर सकता हूं। ज्यादातर मामलों में डी को "जेनेरिक" इंजेक्ट करने के लिए डी का उपयोग करने का अर्थ नहीं होगा (इस मामले में एक सामान्य इंटरफ़ेस से व्युत्पन्न अर्थ) भंडार। सामान्य तरीकों के अतिरिक्त, एक भंडार में इकाई विशिष्ट विधियां होंगी जैसे कि GetCustomersWithPastDueAccounts। आप उस विधि के साथ एक आईसी कस्टमर रिपोजिटरी को परिभाषित कर सकते हैं और अपने ग्राहक रिपोजिटरी को कार्यान्वित कर सकते हैं। फिर आप रनटाइम पर ग्राहक रिपोजिटरी इंजेक्ट करने के लिए निर्भरता इंजेक्शन का उपयोग कर सकते हैं। इसमें कुछ भी गलत नहीं है, लेकिन मेरे अनुभव में यह काफी दुर्लभ है कि आपके पास एक भंडार के कई कार्यान्वयन होंगे ताकि ऐसा करने में थोड़ा सा बिंदु हो।

+0

लेकिन आपके दूसरे दृष्टिकोण के साथ, क्या मैं निर्भरताओं को इंजेक्ट करने की क्षमता खो देता हूं? –

+1

आप हमेशा मैन्युअल निर्भरता इंजेक्शन कर सकते हैं। लेकिन आप सही हैं, आप निर्भरता इंजेक्शन करने के लिए एक डी ढांचे का उपयोग करने में सक्षम नहीं होंगे। मैं अपना जवाब संपादित करूंगा और अधिक स्पष्टीकरण जोड़ूंगा। –

+0

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

0

जब तक कि मैं कुछ गलत नहीं करता, आपके द्वारा लिंक किए गए प्रश्न में स्वीकृत उत्तर जेनिक्स का उपयोग नहीं करता है। वह एक इंटरफ़ेस को परिभाषित कर रहा है और "जेनेरिक" शब्द का उपयोग करने के लिए इंटरफेस मॉडल में किसी भी विशिष्ट तालिका से सीधे बंधे नहीं है।

+0

मुझे नहीं लगता कि यह मामला है, लेकिन यदि यह है, तो IENTityRepository में उन 7 कार्यों के हस्ताक्षर क्या होंगे? –

+1

वह रिपोजिटरी कार्यान्वयन का जिक्र कर रहा है जो आईआरपॉजिटरी इंटरफ़ेस का उपयोग करता है। –

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