2012-03-15 15 views
7

Her etki alanı varlığı için diyelim, bir veri eşleştiricisine API sağlayan bir veri havuzum var. Örneğin, bir UserEntity sahip olursam, bir veritabanında kullanıcı verilerini sürdürmek için bir UserMapper ile konuşan bir UserRepository olurdu.Yeni alan varlıkları nerede oluşturulabilir? Denetleyici, depo veya mapper?

Şimdi, bir web sayfasında bir formun gönderildiğini ve denetleyicimin, gönderilen bilgilere dayanarak yeni bir UserEntity oluşturması gerektiğini bildiğini varsayalım.

bunu mu:

  1. oracıkta orada) yeni UserEntity (do, ve gönderilen form verilerine göre tüm gerekli setter yöntemleri çalıştırmak, kim geçer, repoya UserEntity geçmesi ekleme için eşleştirici?

    Kontrol oluşturur UserEntity => Repo => Eşleyici => DB

  2. bir diziye bir şekilde veri açmak ve daha sonra yeni bir UserEntity() ve ayarlayıcılar çalışan UserRepository için geçmesi ve geçirir

    ekleme için eşleştirici?

    Kontrol kullanıcı veri geçer => Repo oluşturur UserEntity => Eşleyici =>

  3. yeni UserEntity ve sokulması için eşleştirici için dizi geçer UserRepository için dizisi geçirmek DB?

    Kontrolör kullanıcı verilerini geçirir => Repo geçer kullanıcı verileri => Mapper oluşturur UserEntity => kimin görevidir nesnelerin oluşturulmasını yönetmek için olan

DB

?

cevap

1

Bu, yanıtlanması zor bir sorudur. İki sentim, birkaç nedenden dolayı 1 numarada. Öncelikle, varlığınızdaki verileri çok iyi reddedebilecek alan adı doğrulamanıza sahip olduğunuz varsayılır. Eğer 2 ya da 3'te olsaydı, reddedilmeden önce birkaç nesneyi geçtin. 2/3 ve 1 arasındaki fark açısından çok fazla hafıza veya yürütme zamanı olmayabilir, ama bu bir farktır. Hızlı başarısız olmaya çalışıyorum. İkinci olarak, denetleyicinin nesnelerin yanı sıra aktarılan veri hakkında bilgi sahibi olduğunu düşünüyorum. Ben "yağ modeli, sıska denetleyici" ile katılıyorum ama denetleyici varlıklar hakkında bilmiyorum söyleyerek benim denetime çok benim sevme için sıska yapıyor.

+0

Bu durumun harika bir analizi. Diğer düşünceleri duymak beni çok heyecanlandırıyor, ama kesinlikle Kontrolörde oluşturmanın kabul edilebilir olduğunu düşünüyorum. Ancak, belki daha az esneklik? Örneğin, DB'deki Kullanıcı tablosuna yeni bir alan eklersem, UserEntities yaratan her bir Denetleyiciye gitmeyi hatırlamalıyım. – johnnietheblack

+0

Büyük olasılıkla söz konusu yeni bilgileri kabul eden görünümü düzenleyeceksiniz (geleneksel bir web uygulaması hakkında konuştuğumuzu varsayarak), düzenleyiciyi düzenlemek çok fazla değil. Görünümü düzenlemek için kontrol etmeyi unuttuğunuz denetleyiciyi düzenlemeyi unutursanız, şansınız vardır. Ayrıca, basit bir global arama, sınıfınızın nerede kullanıldığını bulabilir. – Crashspeeder

+0

Bir başka iyi nokta, ve eğer Kontrolör cevap ise, o zaman üzülmüyorum ... ama yine de, bazı yerlerde aynı örnekleme sürecini "suçlu" yazan bir parçam var. Yok hayır? Aynı şekilde, yeni tablo değişikliğini yansıtacak form alanları eklemek için yalnızca tek bir dosyada değişiklik gerektirecek şekilde benim görüşlerim ayarlanmış olur. – johnnietheblack

2

Bu sorunun eski olduğunu biliyorum, ancak tek cevabın resmen kabul edilmediğinden buradaki düşüncelerimi buraya atarım ve bu da gelecekteki araştırmacılara yardımcı olabilir. Sorunuzu doğrudan cevaplamak için, yukarıdakilerin hiçbirini söylemem. Denetleyici ile repo/mapper nesneleri arasındaki etkileşimi sağlamak için ekstra bir hizmete, bir "yönetici" ye sahip olmayı tercih ederim. Her model, oluşturulmasını, güncellemelerini ve silinmesini yönetmek için özel bir yöneticiye sahiptir.

Kontrol

bir uygulamanın yapıştırıcı olarak kontrolör düşünün. İstediğimiz konuları olabildiğince çok parçaya ayırabiliyoruz, ancak bir nokta boyunca, bir şey hem görüş tarafını hem de model tarafını anlamak zorundadır ve bu nesne kontrolördür. Bu söylendiğine göre, denetleyicilerin sıska olması gerektiğine inanıyorum, bu yüzden denetleyicinin tek işi bir isteği bir yanıtla eşleştirmek. Herhangi bir ara işlem başka bir yere atılmalıdır.

Bir CRUD uygulamasında, yeni nesnelerin oluşturulmasına ve denetleyicide kalmasına izin vermek oldukça kolaydır; hatta bir kez daha yapılır, çünkü yapıştırmanın yalnızca birkaç satırı vardır. Ya nesne yaratımı önemsiz değilse? Birçok karmaşık ilişkiyle bir uygulamayı sürdürüyorum ve kullanıcı tarafından gönderilen bir oluşturma çoğu zaman aynı anda birçok nesnenin oluşturulmasını gerektiriyor. Bu, denetleyici ve modele dayalı bir ortamda sürdürmek için uygun değildir. FormHandler ve Yöneticisi:

Ekstra Servis Katmanlar

bu işlemek için, ben 2 ekstra hizmet katmanları oluşturduk. Form her gönderildiğinde, form içeriği form işleyicisi katmanına gönderilir. Form işleyicileri, gelen ve normalleştiren form verilerinin anlaşılmasından sorumludur. Form işleyicileri daha sonra verileri işlemek için uygun yönetici nesnelerine aktarabilir. Yönetici nesneleri verileri işler ve alan katmanını günceller. Model oluşturmaya, modelleri değiştirmeye ve arka uca devam etmekten sorumludurlar.

Bu şekilde, denetleyiciler İstek, Yanıt, Form (muhtemelen, çerçeveniz sunucu tarafı form oluşturmayı destekliyorsa) ve FormHandler hakkında bilgi sahibidir. Form işleyicileri, Form (veya form verileri) ve Yöneticisi bilgisine sahiptir. Müdür Deposu, Mapper ve Model bilgisine sahiptir. Şimdi, Bildirimler, Modeller ve Haritalayıcı ile tek etkileşim noktasıdır ve Form verisi ya da İstek ya da Müdahale hakkında hiçbir bilgisi yoktur. Kapak tarafında, denetleyiciler ve form işleyicileri, etki alanı katmanı verileri veya kalıcılığı hakkında bilgi sahibi olmanıza gerek yoktur.

Bu tasarım sayesinde Sonuç

: buldum

Controller -> FormHandler -> ModelManager -> Mapper

tüm sınıfları artık birim test edilebilir dolayı güzel olmanın endişeleri ayrılığı (bir dereceye kadar bile kontrolörleri) vardır bölünmüş ve tek etkileşim noktası, yinelenen mantığı önlemek için bir nimettir.

Notlar

aklımda Repo sadece veritabanını sorgulamak için - bu bir şey varsa yeni şeyler yaratmak değil, onu soruyorum.

bu durumda benim deneyim Symfony 2 ve Doctrine kullanarak dan

2.

YMMV; Örneğin. form katmanı gereksiz olabilir, ancak form/görüntü verisinden alan modellerinin anladığı veri dönüşümü için çok kullanışlı buldum.