5

के साथ जेनेरिक रिपोजिटरी पैटर्न मैं एक सामान्य भंडार पैटर्न को लागू करने की कोशिश कर रहा हूं। मुझे यह साइट मिली जो मुझे लगता है कि यह अच्छी तरह समझाया गया है। http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangleयूनिटऑफवर्क पैटर्न

मेरा उद्देश्य डेवलपर्स को कुछ समय और कीस्ट्रोक को बचाने के लिए है और मुझे पता है कि यह मेरी मदद करेगा।

तो मेरे पास 2 प्रश्न हैं:
1. क्या यह एक अच्छा दृष्टिकोण है या नहीं, क्या मुझे भविष्य में कुछ समस्याएं होंगी?
2. मैं इसे यूनिटोफवर्क पैटर्न के साथ कैसे जोड़ सकता हूं ?, मैं पाठ्यक्रम की अमूर्त कक्षा का एक उदाहरण नहीं बना सकता, इसलिए निम्न कोड इसकी अमान्य है।

public class UnitOfWork : IDisposable 
    { 
     #region Private fields 
     private readonly MyCompanyContext _context = new MyCompanyContext(); 
     private GenericRepository<MyCompanyContext, Task> _taskRepository; 

     public GenericRepository<MyCompanyContext, Task> TaskRepository 
     { 
      get 
      { 
       return _taskRepository ?? 
         (_taskRepository = new GenericRepository<MyCompanyContext, Task>()); 
      } 
     } 




namespace MyCompany.DAL.Repository 
{ 
    public interface IGenericRepository<T> where T : class 
    { 
     IQueryable<T> GetAll(); 
     IQueryable<T> FindBy(Expression<Func<T, bool>> predicate); 
     void Add(T entity); 
     void Delete(T entity); 
     void Edit(T entity); 
     void Save(); 
    } 

    public abstract class GenericRepository<C, T> : 
    IGenericRepository<T> 
     where T : class 
     where C : DbContext, new() 
    { 

     private C _entities = new C(); 
     public C Context 
     { 

      get { return _entities; } 
      set { _entities = value; } 
     } 

     public virtual IQueryable<T> GetAll() 
     { 

      IQueryable<T> query = _entities.Set<T>(); 
      return query; 
     } 

     public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate) 
     { 
      IQueryable<T> query = _entities.Set<T>().Where(predicate); 
      return query; 
     } 

     public virtual void Add(T entity) 
     { 
      _entities.Set<T>().Add(entity); 
     } 

     public virtual void Delete(T entity) 
     { 
      _entities.Set<T>().Remove(entity); 
     } 

     public virtual void Edit(T entity) 
     { 
      _entities.Entry(entity).State = System.Data.EntityState.Modified; 
     } 

     public virtual void Save() 
     { 
      _entities.SaveChanges(); 
     } 
    } 
} 

उत्तर

5

खजाने के बारे में कई राय हैं, लेकिन अपने आप को कुछ साल के लिए उत्पादन में विभिन्न भंडार कार्यान्वयन कोशिश कर के बाद, मैं Ayende's राय है कि भंडार, विशेष रूप से सामान्य से सहमत हैं, निरर्थक अमूर्त परत है। http://www.pluralsight-training.net/microsoft/Courses/TableOfContents/linq-architecture

यह सबसे संभव समाधान के माध्यम से चला गया और बताया कि माल और बुराइयों:

मैं बहुत ज्यादा इस पाठ्यक्रम पसंद आया।

हम अभी क्या उपयोग कर रहे हैं, डेटाकॉन्टेक्स्ट पर बहुत पतला अमूर्त है, केवल लिंक 2 एसक्यूएल टेस्टेबिलिटी मुद्दों को दूर करने के लिए, जो ईएफ का उपयोग करते समय ज्यादातर मामलों में अप्रासंगिक हैं।

2

बहुत से प्रयासों के साथ आपको यह काम मिल सकता है, लेकिन मुझे आश्चर्य है कि प्रयास वास्तव में इसके लायक है या नहीं? मैंने पहले इस तरह के कार्यान्वयन देखा है, और वे कई सारे रिश्तों को प्रबंधित करने का प्रयास करते समय वास्तव में संघर्ष करते हैं (इस बारे में सोचें कि आप अपने परिदृश्य में इसका प्रबंधन कैसे करेंगे)। आप एंटीटी फ्रेमवर्क का उपयोग कर रहे हैं, एक ओआरएम सही? एंटीटी फ्रेमवर्क और एनएचबर्ननेट जैसे ओआरएम को डिज़ाइन किया गया है ताकि एप्लिकेशन कोड से डेटाबेस कार्यान्वयन को सारणीबद्ध किया जा सके, तो इस तरह के दानेदार स्तर पर इकाइयों का प्रबंधन करने के लिए इसके ऊपर एक और अमूर्तता जोड़ने का क्या उद्देश्य है? यदि यह परीक्षण का सवाल है, तो आप संदर्भ के नकल के लिए एक मॉकिंग फ्रेमवर्क का उपयोग कर सकते हैं, इस प्रकार परीक्षण के दौरान वास्तविक डेटाबेस की आवश्यकता को हटा सकते हैं। हालांकि, आर्किटेक्चरल या सुरक्षा कारणों के लिए आप अपने ऐप कोड से डीबी संदर्भ के साथ इंटरैक्शन को हटाने की कोशिश कर रहे हैं, तो मैं इकाई ढांचे के शीर्ष पर कमांड पैटर्न के कार्यान्वयन का उपयोग करके व्यावहारिकता की सिफारिश करता हूं। मुझे इसे बड़े पैमाने पर उद्यम (बैंकिंग) एप्लिकेशन पर करने की आवश्यकता है जहां सुरक्षा कारणों (सही या गलत तरीके से) हमें हमारे आवेदन कोड में डीबी कनेक्शन की अनुमति नहीं थी।

+0

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

+0

हां, आप सही हैं, यूओ के साथ आप वास्तव में अमूर्तता की एक और परत नहीं जोड़ रहे हैं। मुझे लगता है कि यद्यपि बहुत सरल परिदृश्यों को छोड़कर यूओयू बहुत उपयोगी नहीं है, और हां, मुझे लगता है कि आपको तकनीकी समस्याएं हो सकती हैं यदि आपको कई से अधिक रिश्तों का प्रबंधन करना है। –

+0

@LuisEValencia> एचएम, मुझे नहीं लगता कि यह आपके कोड को कैसे सरल बनाता है? – Giedrius