Bir depo gerçekten ne yapmalı?


15

Havuz deseninin çoğunu duydum, ancak bir havuzun gerçekten ne yapması gerektiğini tam olarak anlamadım. "Bir havuzun gerçekten ne yapması gerektiğini" söylediğimde, esas olarak hangi yöntemleri sunması gerektiği konusunda endişeliyim. Örneğin, bir havuz gerçekten CRUD yöntemleri sağlamalı mı yoksa farklı türde bir yöntem sağlamalı mıdır?

Yani, depolar iş mantığı içermeli mi, yoksa sadece veri deposuyla iletişim kurmak ve kaydedilecek veya yüklenecek varlıkları yönetmek için mantık içermeli mi?

Ayrıca havuzların agregalar için kalıcılık birimleri olduğunu duydum. Ama bu nasıl? Bunun pratikte nasıl çalıştığını anlayamıyorum. IRepositoryCRUD yöntemlerini içeren tek bir arayüze sahip olmamız gerektiğini düşündüm ve daha sonra herhangi bir varlık için uygulama sadece bu tür veri deposundan kaydetmek ve almak için mantığı içerecektir.


4
"depolar iş mantığı içeriyorsa" - hayır.
ozz

1
İşte SO ile ilgili bir soruya cevabım
Eric King

2
Bence "gerekir" kelimesine yakalandığınızı düşünüyorum - depo belirli bir kalıptır, bir repo yapmanın en iyi yolu olan bir repo yapılması gerektiği gibi konuşuyorsunuz ; bu bir yanılgıdır, ancak bir repo yapmanın bir yolu var, başka bir şey bir repo olmaz. Bu nedenle, repo paterninin güçlü ve zayıf yanları vardır, ancak bir repoya birden fazla yaklaşım yoktur. Orada olan bir Repo tek olduğu verilerine etkileşime ancak birden çok yolu. Diğer veri etkileşimi yaklaşımları için burayı okuyun
Jimmy Hoffa

Yanıtlar:


14

Havuz kavramına dayanan Bahar Veri Çerçevesinde iyi bir örnek görebilirsiniz .

Burada depoların yalnızca veri deposuyla ilgilendiğini ve nadiren herhangi bir iş mantığı içerdiğini göreceksiniz (bu hizmet katmanı için ayrılmıştır). Örneğin, tasarımlarına bir göz atın , varlıkları yaratma, yok etme ve kurtarma yöntemlerini (diğer şeylerin yanı sıra) ortaya koyan bir CRUDRepository arabirimine sahip olduklarını göreceksiniz . Ayrıca, sonuçları sıralamak ve sayfalamak vb. İçin ekstra işlevsellik ekleyen bir PagingAndSortingRepository de vardır .

Bu çerçeve, iyi bir depo tasarımını incelemek için belki de iyi bir yerdir.

Bildiğim kadarıyla, Bahar Veri Çerçevesi tarafından uygulanan kavramların birçoğu, Alanın Odaklı Tasarım: Yazılımın Kalbinde Karmaşıklıkla Mücadele adlı harika bir kitaptan geliyor , kitap Havuz tasarımına adanmış tüm bir bölüme sahip.

Bir kopyasını almayı düşünebilirsiniz.

Kitaptan küçük bir alıntı şunları açıklıyor:

REPOSITORY modeli, bu çözümleri kapsüllemek ve model odağımızı geri getirmek için basit bir kavramsal çerçevedir.

REPOSİTORY, belirli bir tipteki tüm nesneleri kavramsal bir set olarak (genellikle taklit edilir) temsil eder. Daha ayrıntılı sorgulama yeteneği dışında bir koleksiyon gibi davranır. Uygun türdeki nesneler eklenir ve kaldırılır ve REPOSITORY'nin arkasındaki makineler bunları ekler veya veritabanından siler. Bu tanım, AGGREGATES'in köklerine erken yaşam döngüsünden sonuna kadar erişim sağlamak için tutarlı bir sorumluluk kümesi toplar.

İstemciler, istemci tarafından belirtilen ölçütlere (genellikle belirli özniteliklerin değerine) göre nesneleri seçen sorgu yöntemlerini kullanarak REPOSITORY ürününden nesneleri ister. REPOSITORY, veritabanı sorgularının ve meta veri eşlemesinin makinelerini kapsülleyerek istenen nesneyi alır. Depolar, müşterinin istediği ölçütlere göre nesneleri seçen çeşitli sorgular uygulayabilir. Ayrıca, kaç örneğin bazı ölçütleri karşıladığı gibi özet bilgiler de döndürebilir. Hatta bazı sayısal özniteliklerin eşleşen tüm nesnelerindeki toplam gibi özet hesaplamaları bile döndürebilirler.

REPOSITORY, artık basit, niyeti ortaya çıkaran bir arayüzle konuşabilen ve model açısından neye ihtiyaç duyduğunu sorabilen istemciden büyük bir yük kaldırıyor. Tüm bunları desteklemek için çok sayıda karmaşık teknik altyapı gerekir, ancak arayüz basittir ve kavramsal olarak alan modeline bağlıdır.

Bu nedenle:

Genel erişime ihtiyaç duyan her nesne türü için, bu türdeki tüm nesnelerin bellek içi koleksiyonunun yanılsamasını sağlayabilecek bir nesne oluşturun. Tanınmış bir global arabirim üzerinden erişimi ayarlayın.

Veri deposuna verilerin gerçek olarak eklenmesini veya kaldırılmasını kapsayacak nesneleri eklemek ve kaldırmak için yöntemler sağlayın. Nesneleri bazı ölçütlere göre seçen ve öznitelik değerleri ölçütleri karşılayan tamamen somutlaştırılmış nesneleri veya nesne koleksiyonlarını döndüren yöntemler sağlayın, böylece gerçek depolama ve sorgu teknolojisini kapsülleyin. REPOSITORIES'yi yalnızca doğrudan erişime ihtiyaç duyan AGREGA kökleri için sağlayın. Tüm nesne depolama ve REPOSITORIES erişimine izin vererek istemciyi modele odaklayın.


4

Ne düz bir CRUD arayüzü ne de iş mantığı sağlamalıdır. İş mantığı ve veritabanı arasında aracılık yapar. Arayüz iş mantığı açısından olmalıdır, ancak daha çok bir iş mantığı ilkeli gibi iş mantığının kendisini gerçekleştirmemelidir. Örnek olarak, bir e-posta sistemi kuracağınızı, kullanıcılarınız ve mesajlarınız olduğunu varsayalım. Deponuz kullanıcılar ve iletiler için temel CRUD işlemleri sağlar, ancak GetUsersNewMessages (user) veya GetSearchedMessages (user, searchTerms) gibi iletilerin filtrelenmiş görünümlerini de sağlar.

Fikir, Deponun depolamanın nasıl uygulandığını gizlemesi ve verilere hızlı ve esnek erişim sağlayan temiz bir arayüz sağlamasıdır. Operasyonları, altta yatan destek mağazası için en iyi şekilde uygulamak için daha fazla esnekliğe sahip olduğunuz anlamına gelmek yerine, ne olması gerektiği konusunda yüksek düzeyde tutmak.

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.