2010-11-30 14 views
5

ben şu şekilde ayrılmak C# MVC uygulama var: -> Kontrolör -> Servis - Görünüm> Depo ben geri verdikten benzersiz görünümü modeli olan her görünüm ile ince denetleyici uygulamasını kullanmakBaşka bir hizmet katmanı kötü uygulamasına bir hizmet başvurusu iletiliyor mu?

ilgili hizmetten.

Hızlı Örnek: Görünüm:/NewAppointment/Adım1

Onun Kontrolcü şu şekilde görünecektir:

public ActionResult Step1() 
{ 
    return View(_appointmentService.Step1GetModel()); 
} 

Ve randevu hizmeti katmanı şu şekilde görünecektir:

public Step1Model Step1GetModel() 
{ 
    return new Step1Model(); 
} 

Böylece Uygulamamı kullanarak her biri farklı bir arayüz uygulayan birkaç farklı hizmet katmanım var.

Sorularım, bir hizmet katmanının başka bir hizmet katmanıyla etkileşime girmesi gerektiğinde ortaya çıkar. Bu durumda, servis çağrısına bir arayüz referansı iletmek daha iyi bir uygulama mıdır, yoksa kontrolörün tüm verileri toplamasına ve ardından ilgili sonuçları tekrar servise iletmesine izin vermem gerekir mi?

Örnek:

Ben varsayılan olarak müşterinin bilgileriyle benim bakış modeli doldurmak istediğini farz edelim. Bunu yapmanın bakın iki yolu vardır:

randevu servisine bir müşteri arayüz referansı geçirin ve sonra randevu hizmeti çağrı müşteri hizmetleri uygun GetCustomer yöntemi izin ... Code

:

private ICustomerService _customerService; 
private IAppointmentService _appointmentService; 

public ActionResult Step1() 
{ 
    var viewModel = _appointmentService.Step1GetModel(_customerService); 
    return View(viewModel); 
} 

VEYA

kontrolör müşteri almanın mantığını halletsin, sonra randevu hizmeti ile bu sonucu geçmektedir. Code

: Daha iyi bir uygulama olacağını hangileri olduğu

private ICustomerService _customerService; 
private IAppointmentService _appointmentService; 

public ActionResult Step1() 
{ 
    var customer = _customerService.GetCustomer(); 
    var viewModel = _appointmentService.Step1GetModel(customer); 
    return View(viewModel); 
} 

Ben ayrılıyorum. Birincisi, denetleyiciyi güzel ve ince tutar ancak randevu hizmeti ile müşteri hizmetleri arasında bir hizmet arası bağımlılık oluşturur. İkincisi kontrolöre daha fazla mantık getirir, ancak hizmetleri tamamen bağımsız tutar.

Daha iyi uygulamaların hangisi olacağına dair bir fikri olan var mı?

Teşekkür ~

cevap

6

düşünmek onun tamamen kavramsal ben senin view models hakkında services bilmek şey için mantıklı sanmıyorum. Öncelikle bir denetleyiciye sahip olmanın temel nedenlerinden biri, görünüm mantığınızı iş mantığınızdan ayırmaktır, ancak hizmetleriniz belirli bir veriyi döndürüyorsa, o zaman iş mantığına doğal olarak bağlıdırlar.

İdeal böyle bakmak yöntemi beklediğiniz:

public ActionResult Step1() 
{ 
    var customer = _customerService.GetCustomer(); 
    var appointment = _appointmentService.GetAppointmentFor(customer); 

    var viewModel = new Step1ViewModel(customer, appointment); 

    return View(viewModel); 
} 

olsa daha doğrudan soruya cevap vermek için, ben onlar parçasısın, hizmetiniz birbirleri hakkında bilmek için gayet düşünüyorum aynı kavramsal katman.

Ayrıca bir şey daha ... paralel sınıf hiyerarşileri çok şey var gibi

geliyor neyi sahip hizmetleri, depoları ve kontrolörleri ile. Aşağıdaki gibi bir şey yapmak için çalışma modelinin ünitesi ve güçlü ORM gibi bir şey kullanmak daha mantıklı olabilir: Sonuçta

public MyController(IUnitOfWork unitOfWork)... 

public ActionResult Step1() 
{ 
    var customer = unitOfWork.Find<Customer>(); 
    var viewModel = new Step1ViewModel(customer.Appointment); 
    return View(viewModel); 
} 

, uygulamanın değeri değil hizmetlerinde, modelde yer almaktadır.

+0

Yorumları takdir edin. – TheRightChoyce

+0

whoops, anahtar hataya gir. "Aptal" görüş modellerinin prensiplerini takip ediyorum. Çoğu, bir kurucunun bile bulunmadığını ve bunların hiçbir yönteminin bulunmadığını. Ancak bu şekilde sunulduğunda, bunlara kurucu ekleme mantığını ve daha sonra AutoMapper'ı veya ilgili alan katmanı bilgisini almak için böyle bir mantığı görüyorum. Etki alanı haritalama işinin nereye gittiği ve aptal bir görüş modeli ve şey denetleyicisinin fikrine sadık kalarak içsel bir tartışma geçirdim ... – TheRightChoyce

+0

Bu tam olarak automapper'ın yapıldığı senaryo. İyi ki yardım edebilirim. – jonnii