Bagi saya, repositori, dikombinasikan dengan ORM atau lapisan ketekunan DB lainnya, memiliki kelemahan ini:
- Menutupi Unit Kerja. UoW harus dikodekan oleh programmer dan jarang dapat diimplementasikan sebagai semacam sihir di latar belakang, di mana pengguna hanya membuat kueri dan modifikasi, tanpa mendefinisikan batas-batas UoW dan mungkin titik komit. Kadang-kadang, UoW ditinggalkan dengan menguranginya menjadi micro UoW (misalnya sesi NHibernate) di setiap metode akses Repositori.
- Menutupi, atau, dalam kasus terburuk, menghancurkan Ketidaktahuan Kegigihan: Metode seperti "Memuat ()", "Dapatkan ()", "Simpan ()" atau "Perbarui ()" menyarankan operasi langsung, objek tunggal, seolah-olah mengirim individu SQL / DML, atau seolah-olah bekerja dengan file. Bahkan, misalnya, metode NHibernate, dengan nama-nama yang menyesatkan ini, biasanya tidak membuat akses individu, tetapi memerlukan beban malas atau memasukkan / memperbarui batch (Persistence Ignorance). Terkadang, programmer bertanya-tanya mengapa mereka tidak mendapatkan operasi DB langsung dan secara paksa memecah kebodohan, sehingga mematikan kinerja dan menggunakan upaya besar untuk benar-benar membuat sistem (jauh!) Lebih buruk.
- Pertumbuhan yang Tidak Terkendali. Repositori sederhana mungkin mengumpulkan lebih banyak metode untuk memenuhi kebutuhan spesifik.
Seperti:
public interface ICarsRepository /* initial */
{
ICar CreateNewCar();
ICar LoadCar(int id); // bad, should be for multiple IDs.
void SaveCar(ICar carToSave); // bad, no individual saves, use UoW commit!
}
public interface ICarsRepository /* a few years later */
{
ICar CreateNewCar();
ICar LoadCar(int id);
IList<ICar> GetBlueCars();
IList<ICar> GetRedYellowGreenCars();
IList<ICar> GetCarsByColor(Color colorOfCars); // a bit better
IList<ICar> GetCarsByColor(IEnumerable<Color> colorsOfCars); // better!
IList<ICar> GetCarsWithPowerBetween(int hpFrom, int hpTo);
IList<ICar> GetCarsWithPowerKwBetween(int kwFrom, int kwTo);
IList<ICar> GetCarsBuiltBetween(int yearFrom, int yearTo);
IList<ICar> GetCarsBuiltBetween(DateTime from, DateTime to); // some also need month and day
IList<ICar> GetHybridCarsBuiltBetween(DateTime from, DateTime to);
IList<ICar> GetElectricCarsBuiltBetween(DateTime from, DateTime to);
IList<ICar> GetCarsFromManufacturer(IManufacturer carManufacturer);
bool HasCarMeanwhileBeenChangedBySomebodyElseInDb(ICar car); // persistence ignorance broken
void SaveCar(ICar carToSave);
}
4. Objek Bahaya Tuhan: Anda mungkin tergoda untuk membuat satu kelas dewa, yang mencakup semua model atau lapisan akses data Anda. Kelas repositori tidak hanya berisi metode Mobil, tetapi metode untuk semua entitas.
Menurut pendapat saya, lebih baik menawarkan setidaknya beberapa peluang permintaan, untuk menghindari kekacauan besar dari banyak metode tujuan tunggal. Tidak masalah apakah itu LINQ, bahasa permintaan sendiri, atau bahkan sesuatu yang diambil langsung dari ORM (OK, semacam masalah kopling ...).