MVC Architecture - Kaç Kontrolöre ihtiyacım var?


54

Bir süredir kod yazıyorum, fakat çoğunlukla betikler ve basit uygulamalar. Her şeyin Web Uygulamaları geliştirmek ve uygun bir MVC mimarisi kullanmakla ilgili olduğu yeni bir role girdim, bu yüzden umutsuzca tüm bunları çabucak öğrenmeye çalışıyorum.

Umarım bu soru " MVC Mimarisi için En İyi Uygulamalar " ile aynı değildir, ancak birkaç farklı dersten geçerken, bazılarının farklı şeyler için birden fazla denetleyiciye sahip olduğunu fark ettim.

Tek bir web uygulamasında kaç denetleyiciye ihtiyaç vardır?

Bunun bir örnek olmadan cevaplamanın zor olacağını anladım, o yüzden bir tane vereceğim:

Uygulama:

  1. Kullanıcı oturum açar.
  2. Kullanıcı üç şeyden birini yapabilir:
    a) Bir dosya yükleyin (meta veri içeren bir mongodb veritabanında saklanır).
    b) Bir dosyayı arayın.
    c) Oturumu kapatın.

Benim sorum genel bir sorundur, ancak cevap vermeye çalışan herhangi birine yardım etmek için örnek verdim.


8
Gerçekten güzel bir soru sordu.
Daniel Hollinrake

Yanıtlar:


34

Örneğin, iki kontrolör oluşturacağım:

  • Oturum Açma ve Çıkış Oturumları Denetleyici (REST benzeri düzen için oturum oluşturma ve yok etme)
  • Dosyalar üzerindeki her şey için Dosya Denetleyicisi (index = search and create = upload)

Genel olarak, her şeyi, gösterilebilecek, oluşturulabilecek, düzenlenebilecek ve tahrip edilebilecek bir kaynak olarak düşündüğünüz RESTful bir yaklaşım, size yapıları yapılandırma konusunda iyi bir fikir verir. Örneklerimden de görebileceğiniz gibi, REST'teki her fiile çok yakın kalmam.

Büyük olasılıkla daha fazla işlevsellik için daha fazla denetleyiciye ihtiyacınız olacaktır. Örneğin, kullanıcıların yeni hesaplar oluşturabileceği bir Kullanıcı Kontrolörü. Buna ek olarak, daha yüksek ayrıcalıklara sahip kaynakları düzenleyebileceğiniz bir yönetici arayüzüne ihtiyacınız olacaktır. Böyle bir durumda, hemen hemen her denetleyicinin çoğaltılması oldukça yaygındır.

İlk fikir edinmek için çok kaba bir tahmin, veritabanınızdaki kullanıcıların erişebildiği her tablo için bir denetleyici olabilir. Ancak bu gerçekten sadece çok kaba bir ölçümdür.


3
Yönetici örneğinizi alarak: Yönetici denetleyicisi genel kullanıcıyı uzatır mı ya da tüm yöntemleri tamamen yeniden tanımlıyor musunuz? Örneğin, belki de tüm kullanıcılar yükleyebilir ve arayabilir, ancak yalnızca yöneticiler silebilir. Yönetici denetleyici sınıfı tüm genel kullanıcı yöntemlerini miras alır mı?
Jeff

4
Bu gerçekten gerçek işlevselliğe çok bağlıdır. Fakat genel olarak basit bir şekilde herhangi bir devralma olmadan ikinci bir kontrol cihazı yazmak. 'İnce denetleyici' ilkesini izleyerek bir denetleyicide zaten çok fazla kod olmamalıdır. Ve yönetici denetleyicisi özellikle basit olabilir. Tüm önemli işlevler modele giriyor. (örneğin, bir kullanıcıyı silmek tüm dosyalarının da silinmesi gerektiği anlamına gelirse, model bunu gerçekleştirir, denetleyicide bunun için tek bir satır yoktur)
thorsten müller

6

Bu gerçekten web uygulamasına bağlıdır. Örneğinizde muhtemelen bir tane yeterli. Nakliye, vergi, envanter yönetimi, kademeli fiyatlandırma, vb. İle eksiksiz bir e-ticaret uygulaması uygulamak isteseydiniz, o zaman sadece birkaç tane daha isteyebilirsiniz.

Kontrolörünüz bir veya daha fazla kod kokusundan muzdaripse (özellikle Büyük Sınıf veya Tanrı Nesnesi ), o zaman muhtemelen sadece birinin yapacağı noktayı aştığınızı biliyorsunuzdur.


5

Bu gerçekten sizin uygulama gereksinimlerinize ve iş modüllerinin mimarisine bağlıdır .

Genel bir kural, gerekli denetleyicilerin sayısı Web uygulamasındaki bir çok modüle ve alt modüllere bağlıdır.

Tamamlayıcı olarak, denetleyicileri Alanlar halinde düzenlemek yardımcı olacaktır . Alanlar kavramı ASP.NET MVC çerçevesine dahil edilmiştir ve bir modüle hizmet veren kontrol cihazlarının organizasyonunu kolaylaştırır.

Bir dizi ilgili tartışma var:


1
Harika referanslar! Onları kontrol ettiğinizden emin olacağım!
Jeff,

Elbette, hiç sorun değil.
EL Yusubov

4

Apple'ın bunu yapma şeklini seviyorum.

Her görünüm yalnızca bir görünüm denetleyicisi tarafından kontrol edilir. ~ İOS için Kontrol Cihazı Programlama Kılavuzunu Görüntüle

Buradaki fikir, kolayca Görünümleri değiştirebilmeniz gerektiğidir. IMO, yalnızca Controllerbaşına bir taneye sahip olmak View, bunu başarmayı kolaylaştırıyor. Ancak eminim ki, birden fazla Görüntüleme'ye sahip bir Denetleyiciye sahip olabilir ve yine de tasarım mantığını değiştirmeden Görünümleri değiştirebilmeniz için tasarlayabilirsiniz.


Bu iyi bir nokta, ancak her görünüm için bir denetleyiciye ve ayrıca kullanıcılar gibi şeylerle ilgilenmek için ek denetleyicilere mi ihtiyacınız var? Ayrıca projem daha büyük olsaydı daha fazla denetleyiciye sahip olmak daha mantıklı olur.
Jeff,

Modeller kullanıcıları takip etmelidir. Böylece, birden fazla denetleyicinin tümü gerektiğinde aynı model nesnesini kullanabilir.
Korey Hinton

2
Yani bir kontrolörün bir Model nesnesi ve bir View nesnesi vardır. Denetleyici Model nesnesinden bilgi ister (Kullanıcı Bilgisi gibi) ve ardından Görünümü uygun şekilde ayarlar. Model, program mantığının çoğuna sahip olmalı, Kontrolör ise Görünüm ve Model arasında ileri ve geri iletişim kurabilen bir mantığa sahip olmalıdır.
Korey Hinton

2
Kontrol başına Modelin farklı durumları için denetleyiciniz farklı görünüm modelleri gösteremeyeceğinden görünüm başına bir denetleyici çok sınırlıdır.
EL Yusubov

1
@ElYusubov Nerede kafa karıştırıcı olabileceğini görebiliyorum. İOS'ta her görünüm yalnızca bir görünüm denetleyiciye sahiptir ve her görünüm denetleyicisi yalnızca 1 etkin görünüme sahiptir (ve bu görünüm alt görünümlere sahip olabilir), ancak bu görünüm denetleyicisi herhangi bir sayıda görüntülemeye referans da içerebilir.
Korey Hinton,

2

Sevdiğim bir örnek bir termostat düşünüyor. Bir termostat, MVC şablonunu görüntülemek için mükemmel bir görseldir.


Daha eski, analog bir termostatta bunun gibi şeyleri hayal edebilirsiniz:

Görünüm - Geçerli sıcaklığı gösteren sıcaklık okuyucu.

Kumanda - Sıcaklığı değiştirdiğiniz kadran

Model - İçerideki, sıcaklığın değişmesine neden olan kontrol cihazı tarafından çalıştırılan parçalar.


Her zaman gevşek bağlantı ve sınır modelleri ve tek bir görev için bunlarla ilişkili denetleyicileri izin tasarımları uygun olmalıdır ve gereken istediğiniz kadar birçok modül / denetleyicileri kullanın . Uygulamanızın boyutuna bağlı olarak, modellerden ve denetleyicilerden çok daha az görüntünüz olabilir. Bu, herhangi bir büyük boy uygulamada beklenebilir. İyi Nesneye Yönelik Programlama, gevşek bağlanma, kapsülleme, kalıtım ve polimorfizm ile tanımlanır. Bütün diller aynı derecede polimorfizmi desteklemez (fonksiyon, yöntem, operatörün aşırı yüklenmesi / geçersiz kılması).

MVC mimarisini doğru kullanmayı daha iyi anlamak istiyorsanız, örneğin kod için C ++ ve SmallTalk kullanan GoF "Tasarım Desenleri: Yeniden Kullanılabilir Öğeler ... Yazılımını" danışın. Bu kitap alfa ve omega değil, ama kesinlikle bir başlangıç!

İyi şanslar!


1

Örneğinizin karmaşık bir sisteme dönüşeceğini varsayalım.

Uygulama:

Kullanıcı oturum açar:

  • LoginController

Tek sorumluluğu girişleri ele almak, sonucu yeniden yönlendirmek veya kullanıcıya bildirmektir.

Bir dosya yükle

  • UploadController

Burada herhangi bir dosya türünü yüklemek istediğinizi varsayıyorum. Daha sonraki bir tarihte MP3 ve PDF'leri yüklemeye karar verirseniz, bir temel UploadController, MP3UploadController ve PDFUploadController'a sahip olurdum.

Bir dosyayı arayın.

  • SearchFileController

Bu temel bir gereksinim için yeterli olacaktır. Arama mantığının ne kadar karmaşık olduğuna bağlı olarak daha sonraki bir tarihte birden fazla arama denetleyiciniz olabilir. Sahip olmak istediğiniz son şey, farklı aramalar yapan 20 işlem yöntemine sahip tek bir SearchController.

Çıkış Yap.

-LogoutController .

Biri bunu fazla abartılmış olarak kabul edebilir, ama sanmıyorum. Bence temiz ve hoş bir şekilde ayrılmış.

Bu proje yapısına bakacak olsaydım, ne yaptığını ve nasıl yapılandırıldığını hemen anlardım. Bir adım daha ileri götürün için, ben koyardı LoginControllerve LogoutControllerayrı bölgeye.

Daha önce böyle bir şey geliştirdim ve gerçekten iyi çalıştı.


Giriş için teşekkürler! Herhangi bir çalışma kodunuz var mı? birkaç şeye sıkışıp kaldım.
Jeff,

Hangi sorunları yaşıyorsun?
CodeART

Bir konu ve tarih yükleyebiliyorum (string formatında) ancak dosyanın kendisini yükleyemiyorum (bkz. Stackoverflow.com/questions/18344614/… ).
Jeff,

Ben bir .NET geliştiricisiyim. Üzgünüm size yardımcı olamam.
CodeART

1

Kodunuzun çoğu bir iş katmanında oluyor, değil mi? Durum buysa, denetleyicinizde gerçekten tek yaptığınız görünüme veri döndürmektir.

Denetleyicileri alt tiplere ayırma hayranı olup olmadığımdan pek emin değilim. Endişelerin ayrılmasını sürdürmeniz gerekirken, alt türlerin biraz fazla ileri gittiğini düşünüyorum. Ayrıca, yapıcı veya denetleyicide ağır nesnelerin başlatıldığı durumlarda dikkatli olmanız gerekir. Örneğin: Örnekte, yalnızca kullanıcı giriş sayfasındayken serbest bırakılmak üzere arama / yükleme dosyası için kullanılan ağır bir nesne istersiniz.

Mantıksal birim başına bir denetleyiciye sahip olmak daha iyidir, örneğin AccountController (giriş, kayıt, çıkış), FileController (arama, yükleme) vb.


0

Genel olarak, her bir MODELİN kendi KONTROL CİHAZI ve özel GÖRÜNÜMÜ olduğunu söyleyebilirsiniz. Genel derken, bunun en iyi uygulama olduğu anlamına geliyorum.

uygulama Yönleri (kullanıcı yönetimi gibi) uygulama servisine çevrilmeli ve kontrol cihazı tarafından kendi kendine veya kontrol cihazını sarması gerekir (mesela, kontrol cihazı işlevselliğini, örneğin kullanıcı isteğine göre "görünür" yapan özellikler kullanarak).

Tüm kontrol cihazlarının temel olarak CRUD işlemlerini model üzerinden yapması ve farklı filtreler için farklı görünümler kullanması gerektiğini unutmayın.

Bence MVC'nin desen olarak en büyük avantajlarından biri, modelleri ve görüşleri birleştirmenin en iyi yolunu sunması.

Eklemiş olduğunuz örnek hakkında: 2 kontrolör oluşturacağım: biri tüm kullanıcı giriş işlemleri için (kayıt, giriş, çıkış vb.) Ve ikincisi dosya işlemleri için (Yükleme ve arama). Bunlardan ilki, Login işleviyle ilgili bazı Unsurlarla da yedeklenmeli ve ikincisi ise sıradan denetleyici olmalıdır.


Bir açıklama yapılmadığında, bir başkasının aksi bir görüş bildirmesi durumunda bu cevap yararsız olabilir. Örneğin, bir kullanıcı "Kullanıcı rollerini ve yetkilendirmeyi yönetme denetleyicinin üzerinde olmamalıdır" gibi bir iddia gönderirse , bu cevap okuyucunun iki karşıt görüşü seçmesine nasıl yardımcı olur? Düşünün düzenlemek daha iyi bir şekle ing
tatarcık

1
@gnat Yorumunuzu kabul ediyorum, düzenlenen cevaba bakın
Saturn Technologies
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.