สำหรับฉันที่เก็บรวมกับ ORM หรือเลเยอร์การติดตา DB อื่น ๆ มีข้อเสียเหล่านี้:
- ครอบคลุมหน่วยงาน UoW ต้องถูกเขียนโปรแกรมโดยโปรแกรมเมอร์และแทบจะไม่สามารถนำไปใช้เป็นเวทมนตร์ในพื้นหลังได้ซึ่งผู้ใช้เพียงแค่ทำการสอบถามและแก้ไขโดยไม่ต้องกำหนดขอบเขต UoW และอาจเป็นจุดกระทำ บางครั้ง UoW จะถูกละทิ้งโดยการลดลงใน micro UoW (เช่นเซสชัน NHibernate) ในแต่ละวิธีการเข้าถึง Repository
- ปิดบังหรือในกรณีที่เลวร้ายที่สุดทำลายการเพิกเฉยต่อการคงอยู่: วิธีการเช่น "โหลด ()", "รับ ()", "บันทึก ()" หรือ "อัปเดต ()" แนะนำการดำเนินการวัตถุเดี่ยวทันที SQL / DML หรือเหมือนกับทำงานกับไฟล์ ในความเป็นจริงตัวอย่างเช่นวิธี NHibernate ที่มีชื่อที่ทำให้เข้าใจผิดเหล่านี้มักจะไม่ทำการเข้าถึงแต่ละรายการ แต่จัดคิวสำหรับการโหลดที่ขี้เกียจหรือชุด / แทรก / อัปเดต (Persistence Ignorance) บางครั้งผู้เขียนโปรแกรมสงสัยว่าทำไมพวกเขาไม่ได้รับการดำเนินงานฐานข้อมูลทันทีและบังคับให้เลิกการเพิกเฉยต่อความไม่รู้ซึ่งเป็นการฆ่าประสิทธิภาพและการใช้ความพยายามหลักในการทำให้ระบบแย่ลง (มาก!)
- การเจริญเติบโตที่ไม่สามารถควบคุมได้ แหล่งเก็บข้อมูลอย่างง่ายอาจสะสมวิธีการมากขึ้นเพื่อตอบสนองความต้องการเฉพาะ
เช่น:
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. วัตถุอันตรายของพระเจ้า: คุณอาจถูกล่อลวงให้สร้างคลาสพระเจ้าหนึ่งชั้นซึ่งครอบคลุมรุ่นหรือชั้นการเข้าถึงข้อมูลทั้งหมดของคุณ คลาสที่เก็บจะไม่เพียง แต่มีวิธีการรถยนต์ แต่วิธีการสำหรับหน่วยงานทั้งหมด
ในความคิดของฉันมันจะดีกว่าที่จะเสนออย่างน้อยโอกาสในการค้นหาเพื่อหลีกเลี่ยงความยุ่งเหยิงขนาดใหญ่ของวิธีการหลายวัตถุประสงค์เดียว ไม่ว่าจะเป็น LINQ ภาษาคิวรีของตัวเองหรือแม้แต่บางสิ่งที่นำมาโดยตรงจาก ORM (OK ปัญหาการมีเพศสัมพันธ์ชนิด ...