Bir ASP.NET MVC uygulaması geliştiriyoruz ve şu anda depo / hizmet sınıflarını oluşturuyoruz. Tüm depoların uyguladığı genel bir IRepository arabirimi oluşturmanın, her Deponun kendi benzersiz arabirimine ve yöntem setine sahip olmasına karşın herhangi bir önemli avantajı olup olmadığını merak ediyorum.
Örneğin: genel bir IRepository arayüzü şöyle görünebilir ( bu cevaptan alınmıştır ):
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();
}
Her Depo bu arayüzü uygulayacaktır, örneğin:
- CustomerRepository: IRepository
- ProductRepository: IRepository
- vb.
Önceki projelerde izlediğimiz alternatif şu olacaktır:
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);
}
İkinci durumda, ifadeler (LINQ veya başka türlü) tamamen Depo uygulamasında yer alır, hizmeti uygulayan kişi yalnızca hangi depo işlevinin çağrılacağını bilmesi gerekir.
Sanırım tüm ifade sözdizimini servis sınıfında yazıp depoya geçmenin avantajını görmüyorum. Bu, kolayca karıştırılabilen LINQ kodunun birçok durumda çoğaltıldığı anlamına gelmez mi?
Örneğin, eski faturalama sistemimizde
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
birkaç farklı hizmetten (Müşteri, Fatura, Hesap vb.) Bu, aşağıdakileri birden çok yerde yazmaktan çok daha temiz görünüyor:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
Spesifik yaklaşımı kullanmanın tek dezavantajı, Get * fonksiyonlarının birçok permütasyonuyla sonuçlanabilmemizdir, ancak bu, ifade mantığını Servis sınıflarına itmek için yine de tercih edilebilir görünüyor.
Neyi kaçırıyorum?