OOP Uygulama Mimarisi: Hangi katman tembel bir yükleyici oturmak yok?

2 Cevap php

I am planning the implementation of an Inheritance Mapper pattern for an application component http://martinfowler.com/eaaCatalog/inheritanceMappers.html

O olması gereken bir özellik aggreageted öğeler (10.000 diğer etki alanı nesneleri) büyük bir liste başvurmak için bir etki alanı nesnesi için

Yani tembel yükleme koleksiyonun çeşit diğer etki alanı nesnelere toplam kök etki alanı nesnesi geçirildi gerekir.

Benim (php) tutmak için model i iki klasörde saklayarak am organize komut:

MyComponent\
 controllers\
 models\
  domain\     <- domain objects, DDD repository, DDD factory
  daccess\    <- PoEAA data mappers, SQL queries etc
 views\

Ama şimdi benim tembel yükleme toplama oturur merak beynimi bozucu. Her iki katmanları adımlarla yürümek gibi görünüyor. Veri eşleyiciye dahili onun bir tür, dışarıdan onun etki alanı nesnesi.

Başka başka bir yere bir yerde koymak için herhangi bir öneriniz / gerekçeleri?


  • daccess = veri erişimi
  • DDD = Domain Driven Design Patterns, Eric Evans - kitap
  • Uygulama Mimarisi Patterns PoEAA = Modelleri, Martin Fowler - kitap

2 Cevap

Basit bir cevabı muhtemelen DataAccess katmanda oturur olmasıdır.

//Domain Object
class Store {
  public function GetGiantListOfProducts() { }
}

//DataAccess Object
class LazyLoadingStore extends Store {
  public function GetGiantListOfProducts() { // function override
     // data access code
  }
}

Sonra, DAO bu gibi görünebilir:

class StoreProvider {
  public function GetStoreById($id) {
     //User expects a list of Store, but you actually return a list of LazyLoadingStore - nobody need know the difference
  }
}

Daha karmaşık cevabı - bu kokuyor. Eğer gerçekten tembel yük şeyler gerekiyor mu? Bu yeniden incelemek sizin agrega kökleri daha iyi bir fikir olabilir. Belki de hiç bir $ store.GetGiantListOfProducts () yöntemi gerekmez ve incelikle her ürün bir GetStore () yöntemi vardır ve bunu gibi ürünlerin bir listesini almak ilişki kastetmek değiştirerek tüm sorun sidestep:

class ProductProvider {
  public function GetAllForStore($store) {
     // return list of products for the store
  }
}

Ilişki, başlangıçta çizilen yolu var için varsa Öte yandan, o zaman belki tembel yükleme aslında etki anlamlı bir kavramdır? Bu durumda alanda yaşıyor ve muhtemelen sadece LazyLoader daha özel ve anlamlı bir isim olmalıdır.

Mantıklı?

Veri erişim katmanı yazıyorum el vardır? Eğer öyleyse, burada açıklanan tekniği denemek isteyebilirsiniz:

http://mynerditorium.blogspot.com/2010/01/practical-pi-lazy-loading-for-your-hand.html

Ben standart bir DAO desen daha fazla takip ediyorum unutmayın, ama ben size özel desen tembel yükleme bit uygulamak düşünüyorum.

Yukarıdaki tekniği kullanarak, ben Agregaların DAL agrega için tembel yükleme koleksiyonu takın. Ancak, toplama alanı tabakasının bir üyesi olarak düşünün.