Kami sedang mengembangkan aplikasi ASP.NET MVC, dan sekarang sedang membangun repositori / kelas layanan. Saya bertanya-tanya apakah ada keuntungan utama untuk membuat antarmuka IRepository generik yang diterapkan semua repositori, dibandingkan setiap Repositori yang memiliki antarmuka unik dan serangkaian metode sendiri.
Sebagai contoh: antarmuka IRepository generik mungkin terlihat seperti (diambil dari jawaban ini ):
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();
}
Setiap Repositori akan mengimplementasikan antarmuka ini, misalnya:
- Gudang Pelanggan: Gudang IR
- ProductRepository: IRepository
- dll.
Alternatif yang telah kami ikuti dalam proyek sebelumnya adalah:
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);
}
Dalam kasus kedua, ekspresi (LINQ atau lainnya) akan sepenuhnya terkandung dalam implementasi Repositori, siapa pun yang mengimplementasikan layanan hanya perlu tahu fungsi repositori mana yang harus dipanggil.
Saya kira saya tidak melihat keuntungan dari menulis semua sintaks ekspresi di kelas layanan dan meneruskan ke repositori. Bukankah ini berarti kode LINQ yang mudah diacak digandakan dalam banyak kasus?
Misalnya, dalam sistem faktur lama kami, kami menelepon
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
dari beberapa layanan yang berbeda (Pelanggan, Faktur, Akun, dll). Tampaknya jauh lebih bersih daripada menulis yang berikut di banyak tempat:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
Satu-satunya kelemahan saya melihat untuk menggunakan pendekatan spesifik adalah bahwa kita bisa berakhir dengan banyak permutasi fungsi Get *, tetapi ini tampaknya masih lebih baik untuk mendorong logika ekspresi ke dalam kelas-kelas Layanan.
Apa yang saya lewatkan?