5

मैं भंडार पैटर्न और निर्भरता इंजेक्शन के लिए काफी नया हूं। लगभग सभी भंडार पैटर्न मैं का सामना करना पड़ा तो जैसे GetAll() विधि के कुछ प्रकार है:संग्रहीत प्रक्रियाओं के साथ रिपोजिटरी पैटर्न

public interface IRepository<T> 
{ 
    IQueryable<T> GetAll(); 
    // other CRUD methods here... 
} 

मैं एक मुद्दा इस इंटरफेस और GetAll() विधि को लागू करने क्योंकि मैं एक संग्रहीत प्रक्रिया बोल रहा हूँ हो रही है कि एक पैरामीटर की आवश्यकता होती है जो उपयोगकर्ता के इनपुट के आधार पर बदलती है। मैं भंडार इंटरफ़ेस में विज्ञापन-कार्य विधि नहीं जोड़ना चाहता हूं उदा। IQueryable<T> GetAll(string input);। मैं भी निर्माता के लिए एक पैरामीटर जोड़ने के लिए नहीं करना चाहते हैं, क्योंकि यह मेरे लिए थोड़ा गंदा दिखता है:

public class ConcreteRepository : IRepository<Entity> 
{ 
    string _storedProcedureInput; 

    public ConcreteRepository(string storedProcedureInput) 
    { 
     _storedProcedureInput = storedProcedureInput; 

    public IQueryable<Entity> GetAll() 
    { 
     // Call to stored procedure goes here passing in the 
     // _storedProcedureInput variable. 
    } 
} 

मैं भी निर्भरता इंजेक्शन का उपयोग कर रहा तो मैं जब बाध्यकारी निर्माता के लिए कुछ गतिशील इनपुट जोड़ना होगा :

Bind<IRepository<Entity>>().To<ConcreteRepository>().WithConstructorArgument(?) 

कोई सुझाव?

अद्यतन:

मैं IRepository इंटरफ़ेस पुन: उपयोग करना चाहते हैं। उदाहरण के लिए, एक प्रोग्राम में मैं GetAll() विधि को लागू करने के लिए ईएफ 4 का उपयोग कर रहा हूं, और दूसरे प्रोग्राम में मैं ऊपर दिए गए उदाहरण की तरह संग्रहीत प्रक्रिया को कॉल करने के लिए मानक ADO.NET का उपयोग कर रहा हूं।

+0

आपका कोड बिल्कुल ठीक दिखता है और रिपोस्टिटरी पैटर्न के अनुसार। –

उत्तर

5

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

+0

क्या इसका मतलब है कि मुझे रिपोजिटरी इंटरफ़ेस में एक और विधि जोड़ने की आवश्यकता है उदा। 'IQueryable StoredProcedureMethod (स्ट्रिंग इनपुट)'? जब रिपोजिटरी इंटरफ़ेस का पुन: उपयोग करने का समय आता है, तो StoredProcedureMethod() लागू नहीं किया जाएगा। – jodev

+0

@jodev यह आपके एसपी वास्तव में क्या कर रहा है इस पर निर्भर करता है - ऐसा लगता है जैसे यह सभी रिकॉर्डों का एक उप सेट लौटा रहा है। आप GetAllMatches (SomeMatchingObject मानदंड) प्राप्त करके इनपुट को हमेशा कोशिश और संक्षेप में डाल सकते हैं। एसपी क्या करता है यह जानने के बिना आगे टिप्पणी करना मुश्किल है। –

+0

धन्यवाद। मैं एक उप सेट वापस कर रहा हूं, इसलिए यह समझ में आता है कि आपके द्वारा सुझाए गए एक और तरीके को कॉल को संभालना चाहिए। – jodev

3

मैं सुझाव दूंगा कि यदि आप संग्रहित प्रक्रिया के साथ GetAll का उपयोग कर रहे हैं तो आप इस तरह के बिंदु को खो रहे हैं।

GetAll का उदाहरण जो किसी भी रूप में एक IQueryable infers देरी निष्पादन देता है, लेकिन यदि आप संग्रहीत प्रक्रिया में कॉल कर रहे हैं तो निष्पादन में देरी नहीं होगी।

मैं GetAll फ़ंक्शन को रखने का सुझाव देता हूं, लेकिन आपके ओआरएम के संदर्भ में कॉल के रूप में। कॉल आप संग्रहित प्रक्रियाओं के लिए है, के रूप में अलग तरीकों रखने के लिए, लेकिन IList<Entity>

+0

प्रतिक्रिया के लिए धन्यवाद। मैंने अपनी पोस्ट संशोधित की। मैं संग्रहित प्रक्रियाओं और ईएफ 4 के 'डीबीकॉन्टेक्स्ट' के लिए GetAll() विधि का उपयोग करूँगा। – jodev

5

की तरह कुछ लौट नहीं कर सकते हैं आप अपने IRepository में एक नई विधि जोड़ा कस्टम संग्रहीत proc निष्पादित करने के लिए:

/// <summary> 
    /// Execute Stored Proc with result set returned. 
    /// </summary> 
    /// <param name="procName"></param> 
    /// <returns>An object resultset</returns> 
    T ExecuteCustomStoredProc<T>(string procName, SqlParameter params); 

और अपनी कार्यान्वयन (कंक्रीट रिपोजिटरी) आप इसे इस तर्क को डाल सकते हैं:

 public T ExecuteCustomStoredProc<T>(string commandName, SqlParameter params) 
     { 
      return this._repositoryContext.ObjectContext.ExecuteStoreQuery<T>(commandName, params); 
     } 
संबंधित मुद्दे