हम एक ASP.NET MVC एप्लिकेशन विकसित कर रहे हैं, और अब रिपॉजिटरी / सर्विस क्लासेस का निर्माण कर रहे हैं। मैं सोच रहा था कि क्या कोई सामान्य IRepository इंटरफ़ेस बनाने के लिए कोई बड़ा लाभ है जो सभी रिपॉजिटरी को लागू करता है, बनाम प्रत्येक रिपॉजिटरी का अपना अनूठा इंटरफ़ेस और विधियों का सेट है।
उदाहरण के लिए: एक सामान्य IRepository इंटरफ़ेस की तरह लग सकता है (से लिया गया) इस उत्तर ):
public interface IRepository : IDisposable
{
T[] GetAll<T>();
T[] GetAll<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter);
T GetSingle<T>(Expression<Func<T, bool>> filter, List<Expression<Func<T, object>>> subSelectors);
void Delete<T>(T entity);
void Add<T>(T entity);
int SaveChanges();
DbTransaction BeginTransaction();
}
प्रत्येक रिपॉजिटरी इस इंटरफ़ेस को लागू करेगी, उदाहरण के लिए:
- CustomerRepository: IRepository
- ProductRepository: IRepository
- आदि।
पूर्व परियोजनाओं में हमने जो वैकल्पिक अनुसरण किया है वह होगा:
public interface IInvoiceRepository : IDisposable
{
EntityCollection<InvoiceEntity> GetAllInvoices(int accountId);
EntityCollection<InvoiceEntity> GetAllInvoices(DateTime theDate);
InvoiceEntity GetSingleInvoice(int id, bool doFetchRelated);
InvoiceEntity GetSingleInvoice(DateTime invoiceDate, int accountId); //unique
InvoiceEntity CreateInvoice();
InvoiceLineEntity CreateInvoiceLine();
void SaveChanges(InvoiceEntity); //handles inserts or updates
void DeleteInvoice(InvoiceEntity);
void DeleteInvoiceLine(InvoiceLineEntity);
}
दूसरे मामले में, अभिव्यक्तियाँ (LINQ या अन्यथा) पूरी तरह से रिपॉजिटरी कार्यान्वयन में शामिल होंगी, जो कोई भी सेवा को लागू कर रहा है, उसे यह जानना होगा कि किस रिपॉजिटरी फ़ंक्शन को कॉल करना है।
मुझे लगता है मुझे सेवा वर्ग में सभी अभिव्यक्ति वाक्य रचना लिखने और रिपॉजिटरी में पास होने का फायदा नहीं दिखता। क्या इसका मतलब यह नहीं होगा कि कई मामलों में आसान-से-लाइनअप लाइनक्यू कोड को दोहराया जा रहा है?
उदाहरण के लिए, हमारे पुराने चालान सिस्टम में, हम कॉल करते हैं
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
कुछ अलग सेवाओं (ग्राहक, चालान, खाता, आदि) से। यह कई स्थानों पर निम्नलिखित लिखने की तुलना में बहुत साफ लगता है:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
विशिष्ट दृष्टिकोण का उपयोग करने के लिए एकमात्र नुकसान यह है कि हम गेट * कार्यों के कई क्रमपरिवर्तन के साथ समाप्त हो सकते हैं, लेकिन यह अभी भी सेवा वर्गों में अभिव्यक्ति तर्क को आगे बढ़ाने के लिए बेहतर लगता है।
मैं क्या खो रहा हूँ?