Orta büyüklükteki bir MVC web uygulaması için mimariyi planlarken, katmanları mümkün olduğunca ayrıştırılmış ve test edilmesi kolay olacak şekilde nasıl uygularsınız? (temel olarak en iyi uygulamaları izleyin) Diyelim ki veri erişimim olarak önce kodu kullanıyorum.
"İş mantığını" neyin tanımlayacağı ve veri katmanıyla etkileşimin nasıl kastedildiğiyle mücadele ediyorum. Bir araç satış uygulamasını örnek olarak ele almak, iş mantığı verilen araçlar için vergi bandını hesaplamak, galon başına mili karşılaştırmak gibi görevleri yerine getiren sınıflar olabilir mi? Ticari kuruluşlara gelince (örneğin Arabalar, Vanlar, Motosikletler) Bunları sınıfımla birlikte veri katmanına koyardım DataContext
.
Ayrıca, işin aksine uygulama mantığını ne teşkil eder? Oturum / kullanıcı girişi doğrulamaları gibi şeyleri tahmin ediyorum?
Örneğin, bir araba denetleyicisi türüne ve en iyi mpg'ye göre filtrelenen ilk on arabayı listeleyen bir eylem / görünüm sonucu döndürebilir. Diyelim ki ICarRepository
denetleyicime bir 'carRepo' enjekte ettim (depo desenini / DI kullanarak), arabamı bir eylem yöntemi parametresinden filtreliyorum;var cars = carRepo.getCarsByType("hatchback");
Bu yüzden veri mantığı bilgisini bir depo kullanarak kontrol cihazımın dışında tuttum, şimdi iş mantığını bir etki alanı modeli kullanarak denetleyiciden uzak tutmak için - var sonuç = yeni MpgCalculator (arabalar); - Diyelim ki hesap makinesi sınıfına ihtiyacım var çünkü en iyi yakıt verimliliğini hesaplamak için ek mantık gerçekleştirmesi gerekiyor. Şimdi, veri erişim katmanından almak için bir havuz kullanılan görünümü için bir veri kümesi var ve bu veriler üzerinde işle ilgili görevleri işlemek ve gerçekleştirmek için etki alanına özgü bir nesne var.
Burada hata mı yapıyorum? veri havuzu modelini kullanmaya ihtiyacımız var mı yoksa ORM'yi ve testi ayırmak için sadece bir arabirime kod yazabilir miyim? Bu konuda, somut veri erişim sınıflarım dbcontext veri katmanında olduğu için, arayüz tanımları alan / iş katmanına girmeli, yani veri erişim teknolojisi hiç değişmezse, diğer katmanlarım etkilenmez mi?
Şimdiye kadar okuduğum kadarıyla yapım şöyle:
MVC İnternet Uygulaması -> Standart internet projesi - buradaki modeller ViewModels
Etki Alanı / İş katmanı -> denetleyicilerin ilgili görünümlere geçmeden önce veri katmanındaki etki alanı varlıklarını işlemek için kullanabileceği işe özgü sınıflar / modeller
Havuz soyutlaması gerekli mi? -> Özellikle ORM kullanırken bununla ilgili çok fazla tartışma duyuyorum
Veri katmanı -> Varlık sınıfları (Araba, Kamyonet, Motosiklet), DbContext - Beton veri erişim teknolojisi katmanı