मेरे लिए, रिपॉजिटरी, ORM या अन्य DB दृढ़ता परतों के साथ संयुक्त, इन नुकसान हैं:
- कार्य की इकाइयों को कवर करना। यूओडब्ल्यू को प्रोग्रामर द्वारा कोड किया जाना है और इसे शायद ही कभी पृष्ठभूमि में एक तरह के जादू के रूप में लागू किया जा सकता है, जहां उपयोगकर्ता यूओडब्ल्यू सीमाओं और संभवतः प्रतिबद्ध बिंदु को परिभाषित किए बिना, केवल प्रश्न और संशोधन करता है। कभी-कभी, प्रत्येक रिपॉजिटरी एक्सेस पद्धति में यूओडब्ल्यू को माइक्रो यूओडब्ल्यू (जैसे NHibernate सत्र) में कम करके छोड़ दिया जाता है।
- कवर करना, या, सबसे खराब स्थिति में, दृढ़ता अज्ञान को नष्ट करना: "लोड ()", "जाओ ()", "सहेजें ()" या "अपडेट ()" जैसे तरीके तत्काल, एकल वस्तु संचालन का सुझाव देते हैं, जैसे कि व्यक्तिगत भेजना एसक्यूएल / डीएमएल, या यदि फ़ाइलों के साथ काम कर रहे हैं। वास्तव में, उदाहरण के लिए, NHibernate तरीके, इन भ्रामक नामों के साथ, आमतौर पर व्यक्तिगत पहुंच नहीं बनाते हैं, लेकिन आलसी लोड या डालने / अपडेट बैच (पर्सिस्टेंस इग्नोरेंस) के लिए एन्क्यू। कभी-कभी, प्रोग्रामर आश्चर्यचकित होते हैं कि उन्हें तत्काल डीबी संचालन क्यों नहीं मिलता है और जबरन दृढ़ता से अज्ञानता को तोड़ते हैं, इस प्रकार प्रदर्शन को मारते हैं और वास्तव में सिस्टम को बनाने के लिए बड़े प्रयासों का उपयोग करते हैं (बहुत!) बदतर।
- अनियंत्रित विकास। एक साधारण भंडार विशिष्ट आवश्यकताओं को पूरा करने के लिए अधिक से अधिक तरीकों को जमा कर सकता है।
जैसे कि:
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 से सीधे कुछ लिया (ठीक है, युग्मन समस्या ...)।