Bana göre, ORM veya diğer DB kalıcılık katmanlarıyla birlikte depolar şu dezavantajlara sahiptir:
- İş Birimlerini Kapsayan. UoW'nin programcı tarafından kodlanması gerekir ve nadiren kullanıcının UoW sınırlarını ve muhtemelen taahhüt noktasını tanımlamaksızın sorguları ve modifikasyonları yaptığı arka planda bir tür sihir olarak uygulanabilir. Bazen UoW, her Havuz erişim yönteminde mikro UoW'ye (örn. NHibernate oturumları) indirilerek terk edilir.
- Kalıcılık Cehaletini örtbas etmek veya en kötü durumda yok etmek: "Load ()", "Get ()", "Save ()" veya "Update ()" gibi yöntemler, tek tek gönderme gibi sanki tek tek nesne işlemlerini önerir SQL / DML veya dosyalarla çalışıyormuş gibi. Aslında, örneğin, bu yanıltıcı isimlerle NHibernate yöntemleri genellikle bireysel erişim sağlamaz, ancak tembel yük veya ekleme / güncelleme toplu işlemi için enqueue (Kalıcı Cehalet). Bazen, programcılar neden anında DB işlemlerini alamadıklarını ve zorla kalıcılık bilgisizliğini kırmadıklarını merak ediyorlar, böylece performansı öldürüyorlar ve sistemi gerçekten daha da kötüleştirmek için büyük çaba sarf ediyorlar.
- Kontrolsüz Büyüme. Basit bir havuz, belirli ihtiyaçlara uyacak şekilde gittikçe daha fazla yöntem biriktirebilir.
Gibi:
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. Tanrı'nın tehlikesi nesnesi: tüm modelinizi veya veri erişim katmanınızı kapsayan bir tanrı sınıfı yaratmaya cazip olabilirsiniz. Havuz sınıfı yalnızca Car yöntemlerini değil, tüm varlıklar için yöntemleri de içerecektir.
Benim düşünceme göre, birçok tek amaçlı yöntemin büyük karmaşasından kaçınmak için en azından bazı sorgu fırsatları sunmak daha iyidir. LINQ, kendi sorgu dili veya doğrudan ORM'den alınan bir şey olursa olsun (Tamam, bir tür bağlantı sorunu ...).