আমরা একটি এএসপি.এনইটি এমভিসি অ্যাপ্লিকেশন বিকাশ করছি এবং এখন সংগ্রহস্থল / পরিষেবা ক্লাস তৈরি করছি। আমি ভাবছি যে জেনেরিক 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);
}
দ্বিতীয় ক্ষেত্রে, এক্সপ্রেশনগুলি (লিনকিউ বা অন্যথায়) সম্পূর্ণরূপে সংগ্রহস্থল প্রয়োগে অন্তর্ভুক্ত থাকবে, যে কেউ পরিষেবাটি প্রয়োগ করছে কেবল কোন রেপোজিটরি ফাংশন কল করতে হবে তা জানতে হবে।
আমার ধারণা সার্ভিস ক্লাসে সমস্ত এক্সপ্রেশন সিনট্যাক্স লেখার এবং সংগ্রহশালায় যাওয়ার সুবিধা আমি দেখছি না। এর অর্থ এই নয় যে সহজেই মেসআপআপ লিনকুই কোডটি বহু ক্ষেত্রে নকল করা হচ্ছে?
উদাহরণস্বরূপ, আমাদের পুরানো চালান পদ্ধতিতে, আমরা কল করি
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
কয়েকটি ভিন্ন পরিষেবা (গ্রাহক, চালান, অ্যাকাউন্ট, ইত্যাদি) থেকে এটি একাধিক জায়গায় নিম্নলিখিত লেখার চেয়ে অনেক পরিচ্ছন্ন বলে মনে হচ্ছে:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
সুনির্দিষ্ট পদ্ধতির ব্যবহারের জন্য আমি দেখতে পাচ্ছি একমাত্র অসুবিধা হ'ল আমরা get * ফাংশনগুলির অনেক অনুমতি দিয়ে শেষ করতে পারি, তবে এটি এখনও সার্ভিস ক্লাসগুলিতে অভিব্যক্তি যুক্তিটিকে ধাক্কা দেওয়া ভাল বলে মনে হয়।
আমি কী মিস করছি?