เรากำลังพัฒนาแอปพลิเคชัน ASP.NET MVC และตอนนี้กำลังสร้างคลาสที่เก็บ / บริการ ฉันสงสัยว่าการสร้างอินเทอร์เฟซ IRepository ทั่วไปมีประโยชน์หรือไม่เมื่อเทียบกับแต่ละ Repository ที่มีอินเทอร์เฟซและชุดวิธีการเฉพาะของตัวเอง
ตัวอย่างเช่นอินเทอร์เฟซ 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();
}
แต่ละ Repository จะใช้อินเทอร์เฟซนี้ตัวอย่างเช่น:
- 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 หรืออื่น ๆ ) จะมีอยู่ทั้งหมดในการนำ Repository ไปใช้งานใครก็ตามที่ใช้บริการเพียงแค่ต้องรู้ว่าจะเรียกใช้ฟังก์ชันที่เก็บใด
ฉันเดาว่าฉันไม่เห็นข้อดีของการเขียนไวยากรณ์นิพจน์ทั้งหมดในคลาสบริการและส่งไปยังที่เก็บ นี่จะไม่หมายความว่ารหัส LINQ ที่ง่ายต่อการทำให้สับสนในหลาย ๆ กรณีหรือไม่?
ตัวอย่างเช่นในระบบการออกใบแจ้งหนี้เดิมเราเรียก
InvoiceRepository.GetSingleInvoice(DateTime invoiceDate, int accountId)
จากบริการที่แตกต่างกันเล็กน้อย (ลูกค้าใบแจ้งหนี้บัญชี ฯลฯ ) ดูเหมือนว่าจะสะอาดกว่าการเขียนสิ่งต่อไปนี้ในหลาย ๆ ที่:
rep.GetSingle(x => x.AccountId = someId && x.InvoiceDate = someDate.Date);
ข้อเสียเดียวที่ฉันเห็นในการใช้วิธีการเฉพาะคือเราสามารถจบลงด้วยการเรียงสับเปลี่ยนของฟังก์ชัน Get * มากมาย แต่ดูเหมือนว่าจะดีกว่าในการผลักตรรกะนิพจน์เข้าสู่คลาส Service
ฉันขาดอะไรไป?