1) ORM'leri devre dışı bırakmak isterseniz ne yaparsınız, eğer onu bir depoda içermezseniz uygulamanızda belirli ORM kodunuz olur.
Şirketin aniden veri erişim teknolojisini değiştirmeye karar verdiği bir pozisyonda bulunmadım. Bu olursa, biraz çalışma gerekecektir. Arayüzler üzerinden veri erişim işlemlerini soyutlama eğilimindeyim. Depo bunu çözmenin bir yoludur.
Daha sonra veri erişim katmanımın somut bir şekilde uygulanması için farklı bir montaj yapacağım. Örneğin, ben olabilir:
Company.Product.Data
ve Company.Product.Data.EntityFramework
montajlar. İlk montaj tamamen arayüzler için kullanılacak, diğeri Entity Framework'ün veri erişim mantığının somut bir uygulaması olacaktı.
2) Bir ORM kullanılmadığında depo deseni hala geçerli mi ve veri erişimi ve nesne verilerini kendiniz doldurmak için ADO.net'i mi kullanıyorsunuz?
Hangi kalıbın geçerli olup olmadığına karar vermek size kalmış. Sunum katmanında bir depo deseni kullandım. Akılda tutulması gereken bir şey, insanların depolara sorumluluk atmaktan hoşlandığıdır. Bilmeden önce, depo sınıfınız dans edecek, şarkı söyleyecek ve her türlü şeyi yapacak. Bundan kaçınmak istersiniz.
GetAll, GetById, Update ve Delete sorumluluklarına sahip olarak başlayan bir depo sınıfı gördüm, ki bu iyi. Proje tamamlandığında, aynı sınıfta hiç bulunmaması gereken düzinelerce yöntem (sorumluluk) vardı. Örneğin GetByForename, GetBySurname, UpdateWithExclusions ve her türlü çılgınca şeyler.
Bu, sorguların ve komutların devreye girdiği yerdir.
3) ORM kullanıyorsanız, ancak yaygın olarak kullanılan sorguları sakladığınız veri havuzu modelini kullanmıyorsanız. Her sorguyu bir sınıf olarak temsil etmek ve örnekler oluşturmak için bir çeşit sorgu fabrikası bulundurmak akıllıca olur mu?
Depolar yerine sorgu ve komutları kullanmak çok iyi bir fikir. Aşağıdakileri yaparım:
Bir sorgu için arayüz tanımlayın. Bu birim testi yapmanıza yardımcı olacaktır. Örneğinpublic interface IGetProductsByCategoryQuery { ... }
Bir sorgu için somut uygulamayı tanımlayın. Bunları, seçtiğiniz IoC çerçevesi aracılığıyla enjekte edebileceksiniz. Örneğinpublic class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Şimdi deposu onlarca sorumlulukla kirletmek yerine, sorgularımı ad alanlarında gruplandırıyorum. Örneğin, yukarıdaki sorgu için bir arayüz şu ülkelerde Company.SolutionName.Products.Queries
yaşayabilir:Company.SolutionName.Products.Queries.Implementation
Verileri güncelleme veya kaldırma söz konusu olduğunda, komut desenini aynı şekilde kullanıyorum.
Bazıları buna katılmayabilir ve proje tamamlanmadan düzinelerce sınıfınız ve ad alanınız olacağını söyleyebilir. Evet yapacaksın. Benim fikrime göre, seçtiğiniz IDE'deki çözüme göz atabileceğiniz ve belirli bir bileşenin ne tür sorumluluklara sahip olduğunu anında görebileceğiniz için iyi bir şey. Bunun yerine bir havuz kalıbı kullanmaya karar verdiyseniz, sorumluluklarını çözmeye çalışan her bir depo sınıfının içine bakmanız gerekir.