ASP.NET MVC - Denetleyicilerde iş mantığı olmalı mı?


97

Derik Whitaker , birkaç gün önce bir süredir merak ettiğim bir noktaya denk gelen bir makale yayınladı : kontrolörlerde iş mantığı olmalı mı?

Şimdiye kadar gördüğüm tüm ASP.NET MVC demoları, denetleyiciye depo erişimi ve iş mantığı koydu. Hatta bazıları oraya doğrulama bile atıyor. Bu oldukça büyük, şişirilmiş denetleyicilerle sonuçlanır. MVC çerçevesini kullanmanın yolu gerçekten bu mu? Görünüşe göre bu, farklı denetleyicilere yayılmış çok sayıda yinelenen kod ve mantıkla sonuçlanacak.


Makalenin bağlantısı ölü - web.archive.org/web/20150906064521/http://devlicio.us/blogs/… , ilgilenen diğer herkes için archive.org'dan bir kopyadır.
Stuart Moore

Yanıtlar:


75

İş mantığı gerçekten modelde olmalıdır. Şişman modeller, sıska kontrolörler hedeflemelisiniz.

Örneğin, sahip olmak yerine:

public interface IOrderService{
    int CalculateTotal(Order order);
}

İsterim:

public class Order{
    int CalculateTotal(ITaxService service){...}        
}

Bu, verginin harici bir hizmet tarafından hesaplandığını varsayar ve modelinizin harici hizmetlerinize yönelik arayüzler hakkında bilgi sahibi olmasını gerektirir.

Bu, denetleyicinizin şöyle görünmesini sağlar:

public class OrdersController{
    public OrdersController(ITaxService taxService, IOrdersRepository ordersRepository){...}

    public void Show(int id){
        ViewData["OrderTotal"] = ordersRepository.LoadOrder(id).CalculateTotal(taxService);
    }
}

Ya da böyle bir şey.


1
Öyleyse, depolar yerine denetleyicilerinize Hizmetler enjekte eder miydiniz? Bu durumda Çalışma Birimi ilkesi nasıl devreye girer?
Kevin Pang

Biraz daha yazdım, umarım bu daha mantıklıdır. Ayrıca şunu da okumak isteyebilirsiniz: weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model Rails ile ilgili olmasına rağmen hala çok uygulanabilir.
jonnii

Bir depoya kişisel olarak hizmet derdim.
Brad Wilson

Kesinlikle bir tür hizmettir, ancak özellikle veri erişimi içindir. Bu sadece kullandığım bir kongre, özellikle savunduğum bir şey değil.
jonnii

1
Bu, modelinizi ITaxService ile sıkı bir şekilde birleştirecektir. Modeli başka bir projede veya başka bir dll'de yeniden kullanmak istiyorsanız, ITaxService uygulamasına veya referansına sahip olmanız gerekir, aksi takdirde modeliniz bozulur ve bu da SOLID ilkelerinin ihlal edilmesine neden olur. ITaxService, modelinizin bir referansına sahip olmalıdır. Bu şekilde, modelinizi ITaxService referansına ihtiyaç duymadan başka bir projede yeniden kullanabilirsiniz.
Mehmet Ali Sert

65

Microsoft Patterns & Practices tarafından sunulan diyagramı beğendim . Ve 'Bir resim bin kelimeye bedeldir' atasözüne inanıyorum.

Diyagram, MVC ve iş hizmetleri katmanlarının mimarisini gösterir


6
Bu gerçekten kullanışlı! Bu diyagramı o sitenin neresinde bulduğunuzu söyler misiniz?
Rob Kilisesi

2
Bu, Microsoft'un 'Sunucu Tarafı Uygulaması'ndan alınmıştır msdn.microsoft.com/en-us/library/hh404093.aspx
Justin

Tamam ama diyelim ki bir MVC uygulamasında - iş mantığı nereye gidiyor? Ek bir servis katmanına veya başka bir şeye ihtiyacımız var gibi görünüyor ?!
niico

14

Bu büyüleyici bir soru.

Bence çok sayıda örnek MVC uygulamasının, "iş mantığını" tamamen modele gerçekten yerleştirme anlamında MVC paradigmasını takip edememesi ilginç. Martin Fowler, MVC'nin Gang Of Four anlamında bir model olmadığına işaret etti. Daha ziyade, programcı desenleri eklemeniz gerekir paradigma olduğu için onlar bir oyuncak app ötesinde bir şey yaratma eğer.

Bu nedenle, kısa cevap, "iş mantığının" denetleyicide gerçekten yaşamaması gerektiğidir, çünkü denetleyicinin görünüm ve kullanıcı etkileşimleriyle ilgilenme ek işlevi vardır ve biz sadece tek bir amaçla nesneler oluşturmak istiyoruz.

Daha uzun bir cevap, mantığı denetleyiciden modele taşımadan önce model katmanınızın tasarımına biraz düşünmeniz gerektiğidir. Belki de tüm uygulama mantığını REST kullanarak halledebilirsiniz, bu durumda modelin tasarımı oldukça net olmalıdır. Değilse, modelinizin şişmesini önlemek için hangi yaklaşımı kullanacağınızı bilmelisiniz.


14

Hizmet Katmanı ile Doğrulama'yı gösteren bu harika öğreticiye Stephen Walther tarafından bakabilirsiniz .

Doğrulama mantığınızı denetleyici eylemlerinizden ayrı bir hizmet katmanına nasıl taşıyacağınızı öğrenin. Bu eğitimde Stephen Walther, hizmet katmanınızı denetleyici katmanınızdan ayırarak endişelerinizi nasıl keskin bir şekilde ayırabileceğinizi açıklıyor.


2
Bu en doğru cevap. Kişisel olarak ayrıca, hizmetleri kontrolöre sunmamayı, bunun yerine MVVM modelinde bulunan gibi bir ViewModel konseptini kullanmayı tercih ediyorum. Bir masaüstü arayüzü (örneğin, windows formları veya WPF) ve ayrıca bir web arayüzü ile bir iş uygulaması yazmak istediğiniz bir senaryo hayal edin. Bu problemi çözmek sizi burada da savunulduğu gibi "zayıf kontrolör" modeline götürür. Sonuç olarak: İş mantığını asla bir modele veya bir denetleyiciye koymayın ve sahip olmadığınız bir denetleyiciye de hiçbir şey koymayın.
Sam

9

İş Mantığı, denetleyicilere dahil edilmemelidir. Kontrolörler olabildiğince zayıf olmalı, ideal olarak pıtırtı izleyin:

  1. Etki alanı varlığını bulun
  2. Etki alanı varlığına göre hareket et
  3. Sonuçları görüntülemek / döndürmek için verileri hazırlayın

Ek olarak denetleyiciler bazı uygulama mantığını içerebilir.

Peki iş mantığımı nereye koymalıyım? Modelde.

Model nedir? Şimdi bu iyi bir soru. Lütfen Microsoft Kalıplar ve Uygulamalar makalesine bakın (mükemmel bulmak için AlejandroR'a övgü). Burada üç model kategorisi vardır:

  • Modeli Görüntüle : Bu, basitçe bir veri torbasıdır, eğer varsa, verileri görünümlerden ve görünümlere aktarmak için minimum mantık, temel alan doğrulamasını içerir.
  • Etki Alanı Modeli : İş mantığına sahip şişman model, tek veya birden fazla veri varlığında çalışır (yani, belirli bir durumda A varlığı, B varlığı üzerindeki eylemden daha çok)
  • Veri Modeli : Depolamaya duyarlı model, tek bir varlık içinde bulunan mantık yalnızca o varlıkla ilgilidir (yani, eğer a alanı ise b alanı)

Elbette MVC, farklı çeşitlerde gelen bir paradigmadır. Burada anlattığım şey MVC'nin yalnızca üst katmanı işgal ettiği , Wikipedia'daki bu makaleye bakın

Bugün, MVC ve benzer model-görünüm-sunucu (MVP), yalnızca daha büyük bir sistemin sunum katmanına uygulanan Kaygı Ayrımı tasarım kalıplarıdır. Basit senaryolarda MVC, doğrudan veri tabanına ulaşan bir sistemin birincil tasarımını temsil edebilir; ancak, çoğu senaryoda, MVC'deki Denetleyici ve Model, bir Hizmet veya Veri katmanına / katmanına gevşek bir bağımlılığa sahiptir. Bu tamamen İstemci-Sunucu mimarisi ile ilgili


-1

Bağımlılık Enjektörlerini kullanırsanız, iş mantığınız onlara gidecek ve dolayısıyla düzgün ve temiz denetleyiciler alacaksınız.

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.