MVC + 3 katmanı; ViewModels nerede devreye giriyor?


11

ASP.NET MVC 4 kullanarak 3 katmanlı bir uygulama tasarlıyorum. Referans olarak aşağıdaki kaynakları kullandım.

Şimdiye kadar aşağıdaki tasarımlarım var.

Sunum Katmanı (PL) (ana MVC projesi, E ve MVC veri erişim katmanı taşındı):

MyProjectName.Main
    Views/
    Controllers/
    ...

İş Mantığı Katmanı (BLL) :

MyProjectName.BLL
    ViewModels/
    ProjectServices/
    ...

Veri Erişim Katmanı (DAL) :

MyProjectName.DAL
    Models/
    Repositories.EF/
    Repositories.Dapper/
    ...

Şimdi PL, BLL ve BLL referanslarını DAL referanslarıdır. Bu şekilde alt tabaka üstündeki tabakaya bağlı değildir.

Bu tasarımda PL, BLL'nin bir hizmetini çağırır. PL bir View Modelini BLL'ye geçirebilir ve BLL bir View Modelini PL'ye geri iletebilir.

Ayrıca, BLL DAL katmanını çağırır ve DAL katmanı bir Modeli BLL'ye geri döndürebilir. BLL, bir Görünüm Modeli oluşturabilir ve PL'ye döndürebilir.

Şimdiye kadar bu model benim için çalışıyordu. Ancak, bazı ViewModels'ımın birkaç varlıkta birleşim gerektirdiği bir sorunla karşılaştım. Düz MVC yaklaşımında, kontrolör joins ve sonra yapmak için bir LINQ sorgusu kullandım select new MyViewModel(){ ... }. Ama şimdi, DAL'de ViewModels'ın tanımlandığı yere (BLL'de) erişimim yok.

Bu, DAL'de birleştirme yapıp BLL'ye geri döndüremeyeceğim anlamına gelir. DAL (bir sorguda birleşimler yerine) ayrı sorgular yapmak zorunda gibi görünüyor ve BLL sonra bir ViewModel oluşturmak için bunların sonucunu kullanır. Bu çok rahatsız edici, ama ben DAL ViewModels maruz olması gerektiğini sanmıyorum.

Bu ikilemi nasıl çözebileceğim hakkında bir fikrin var mı? Teşekkürler.

Yanıtlar:


18

MVC'nin M'si Veri Erişim Katmanına taşındığı ana MVC projesi

Yaygın yanlış anlama. MArasında MVCbu kadar iddia birçok örnekler ve öğreticiler rağmen verilerle ilgisi yoktur.

M ViewModelinizdir ve MVC projenizde bulunmalıdır. BLL'nizde bulunan ViewModels aslında DataContracts veya BusinessModels olarak adlandırılacaktır.

Denetleyicinizde bununla karşılaştırılabilir bir şey var:

Get(id):
    dataContract = _service.Get(id);
    viewModel = Map(dataContract);
    return viewModel

Hizmetinizde böyle bir şey:

Get(id):
    dataModel = _dataAccess.Get(id);
    dataContract = Map(dataModel);
    return dataContract;

Ve DataAccess'te, istenen nesneye göre uygun birleşimleri gerçekleştirirsiniz. Ancak elbette gerektiğinde DataAccess'inize özel yöntemler eklemekte özgürsünüz, böylece hizmetiniz bu yöntemleri çağırabilir:

GetWithBars():
    dataModels = _repository.Query("select from foos join bars");
    return dataModels;
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.