Karmaşık nesne modelleri için depo desenini nasıl uygulamalıyım?


21

Veri modelimiz yaklaşık bir düzine işlevsel alana ayrılabilen yaklaşık 200 sınıfa sahiptir. Etki alanları kullanmak iyi olurdu, ancak ayrılık o kadar temiz değil ve değiştiremeyiz.

Entity Framework'ü kullanmak için DAL'imizi ve bir Reprodüksiyon modeli kullanmayı önerdiğim önerilerin çoğunu kullanmak için yeniden tasarlıyoruz . Ancak, örneklerin hiçbiri gerçekten karmaşık nesne modelleri ile ilgilenmiyor. Bulduğum bazı uygulamalar, varlık başına bir depo kullanıldığını gösteriyor. Bu, büyük ve karmaşık modeller için gülünç ve bakımsız görünüyor.

Her operasyon için bir UnitOfWork ve her işletme için bir Depo oluşturmak gerçekten gerekli midir? Binlerce dersle bitebilirim. Bunun mantıksız olduğunu biliyorum, ancak karmaşık modeller ve gerçekçi iş uygulamaları konusunda Depo, İş Birimi ve Varlık Çerçevesini uygulama konusunda çok az rehberlik buldum.

Yanıtlar:


6

İlk önce, sahip olduğunuz her varlıktan geçip kendinize soracaksınız:

Bu varlığı tek başına sürdürmek mantıklı mı?

Burada demek istediğim, nesne modelinizde, bazı varlıkların diğerlerinde ana-detay ilişkisinde yer almasıdır. Varlığınız bir başkasına büyük ölçüde bağımlıysa, yalnızca bu varlık için bir depo oluşturmayın çünkü büyük olasılıkla kendisi tarafından ısrar edilmeyecektir. Bunun yerine, her bir ebeveyn sınıfı için bir havuz oluşturacak ve çocuk varlıklar ile diğer ilişkilerin aynı anda devam etmesini sağlayacaksınız.

Sağladığınız bağlantıda UnitOfWork desenini nasıl uyguladıklarını sevmiyorum. Bu satırlar boyunca daha fazlasını yapmanı öneririm . Depo başına bir sınıf tanımlamanız gerekmez. Aynı sınıf her depo için kullanılabilir; her biri operasyonun ömrü boyunca kendi UnitOfWork sınıfı örneğine sahiptir. Aynı UnitOfWork'u aynı anda kalıcı olmasını istediğiniz değişiklikler için farklı havuzlarda da kullanabilirsiniz.


Güzel link! Kontrol ediyorum.
Eric Falsken

Bağlantınız (ve cevabınız) en çok yardımcı oldu, ancak verilen kalıpları kullanmamaya başladım. Genel bir depo olarak çalışmak için Add / Attach / Remove / SaveChanges yöntemlerini belirleyen bir sarmalayıcı sınıfı kullandım ve ardından sorgu uygulamamı tutmak için özel sorgu sınıfları kabul eden bir Query / QuerySingle / QueryAll yöntemi ekledi. Bu gayet iyi çalışıyor, böylece doğrudan EF'ye dahil olmadan hem LINQ hem de T-SQL sorgularını yapabiliyorum.
Eric Falsken

Varlık Çerçevesi, işlemlerin kullanımı ile birlikte zaten Çalışma Birimi modelinin bir uygulamasıdır.
Greg Burghardt

1
bağlantı öldü ...
Newtopian

3

Belki de Domain-Driven Design'a göz atmalısın . Nesnelerin Toplamalarda gruplandırılmasını ve yalnızca her Topluluğun Kök varlığı için havuzlar oluşturmanızı önerir. Büyük bir karmaşık nesne modeline düzen getirmenin güzel bir yolu.

Farklı fonksiyonel alanlarınız Sınırlı Bağlamlar olabilir . Aralarındaki ayrım açık değilse örtüşen Sınırlı Bağlamlarla başa çıkmak için çeşitli teknikler vardır .


0

"Depo deseni" veritabanı tasarımı için hangi teorik temeli buldunuz? Hiçbirini sanmıyorum. Sahte bir binada oturan bir karmaşıklık katmanıdır: "kalıcılık katmanı" ndan izole etmeniz gereken bir şeydir. Söyleyebileceğim kadarıyla, ilişkisel tasarım ilkelerinin yaygın olmayan programlama cehaletiyle oynuyor ve uygulamanın OO tasarımının önceden belirlenmiş bir merkeziyetiyle ilgileniyor. Fakat teorik gerekçelerden bağımsız olarak, rasyonel, varlığındaki varlığını haklı çıkarmaz.

Veritabanı tasarımına giden tek doğru yol 30 yıl içinde değişmedi: verileri analiz etmek. Anahtarları ve kısıtlamaları ve çoktan bire ilişkilerini bulun. Tablolarınızı Boyce-Codd normal formuna göre tasarlayın. Veri erişimini kolaylaştırmak için görünümleri ve saklı yordamları kullanın.

Her ne kadar sevilmemişse, bir SQL DBMS, programcının sağlayabileceği her şeyden daha iyi bir yalıtım katmanı sağlar. Veri tabanı değiştikçe erişmek için kullanılan SQL'in değişmesi gerekebileceği doğrudur. Ancak , arabuluculuk katmanının olup olmadığına bakılmaksızın bunun doğru olduğunu unutmayın . Uygulama, DBMS'ye erişmek için görünümler ve saklı yordamlar kullandığı sürece, sıradan SQL mühendislik araçları, temeldeki veritabanında yapılan değişikliklerin bu görünümleri ve saklı yordamları geçersiz hale getirdiğini gösterecektir.

Elbette, zorluk var. Bir arabuluculuk katmanı, izolasyon illüzyonunu ve nasıl yapılacağını bildiği bir yazma kodu programcısına konfor sağlar. Veritabanı tasarımını ve SQL'i öğrenmek, yeni bir şeyler öğrenmeyi gerektirir. Çoğu insan düşünmekten çok ölür ve çoğu başarılı olur.

Takımınızdaki biri şüphesiz, 200 dersinizi desteklemek için SQL yazmanın çok fazla iş olduğunu düşünüyor. Şüphesiz. Ama en azından faydalı bir iş. OO tasarımınızı taklit ederek bir veritabanı tasarlarsanız, çoğu işe yaramaz, birçok işe yaramaz ve DBMS'nin size sunduklarının çoğunu yenersiniz.

Örneğin, Çalışma Birimi'ni veritabanına yansıtan düşünün (tablo veya tablolar gibi, sanırım). İş birimi DBMS'nin yerleşik bir hizmetidir: begin transaction... veritabanını güncelle commit transaction. Sınıflarınızın SQL'deki veritabanı tablolarıyla eşleştirilmesinden başka modellenecek bir şey yok.

Sorunuz 4 yıl önce gönderildi. Cevap veriyorum, çünkü son zamanlarda bir şekilde "güncellendi", bunun hala birileri için ilgi çekici olduğunu gösteriyor. Umarım cevabım, okuyucuyu, anlamsız bir geçici çözüm benimsemek yerine, temel ilişkisel teoriyi soruna uygulamaya teşvik eder.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.