14

ASP.NET MVC uygulamasında veri erişimi için bir birim iş ve depo örüntüsü kullanıyorum.İş modelini modele dönüştürmek için nerede kullanılır?

İçinde tanımlanmış olan iş birimi ve depo birimi birimini kullanarak denetleyicideki ilgili varlık kümesini getiriyorum. Yeni başlayan bilgimle, iş modelini getirip onu modele dönüştürmek için iki yol düşünebilirim.

  • Deposu iş kontrolör modeli model için eşleştirilmiş daha, bu model, veya
  • deponun model için iş modeli dönüştürür ve sonra denetleyiciye geri döndürür.

Şu anda ilk yaklaşımı kullanıyorum, ancak denetleyici kodum çok sayıda özelliğe sahip görünüm modelleri için çirkin ve uzun görünmeye başladı.

Diğer yandan, depomuzun UserRepository (örneğin) olarak adlandırıldığından, yalnızca tek bir görünüm için yararlı olan bir model yerine doğrudan iş modelini döndürmesi gerektiğini düşünüyorum.

Bunlardan hangisinin büyük projeler için daha iyi bir uygulama olduğunu düşünüyorsunuz? Alternatif bir yol var mı?

Teşekkürler.

+1

Bu soruya [yanıt] [1], bunun nasıl daha iyi yapılabileceğini açıklamalıdır. [1]: http://stackoverflow.com/questions/3747383/best-practices-to-partition-model-code-to-logical-parts-in-mvc-which-is-the- bes/3747474 # 3747474 –

cevap

20

havuzları modelleri görüntüleyemez, alan modelleri döndürmelidir. Modeller ve görünüm modelleri arasındaki eşleme söz konusu olduğunda, ben şahsen ben AutoMapper kullanın, bu yüzden ayrı bir haritalama katmanım var ama bu katman kontrolörden çağrılıyor. İşte

tipik GET denetleyici eylem gibi görünebilir nasıl:

elbette tekrarlayan haritalama mantığını önlemek için özel bir eylem filtresi ile kısaltılabilir olabilir
public ActionResult Foo(int id) 
{ 
    // the controller queries the repository to retrieve a domain model 
    Bar domainModel = Repository.Get(id); 

    // The controller converts the domain model to a view model 
    // In this example I use AutoMapper, so the controller actually delegates 
    // this mapping to AutoMapper but if you don't have a separate mapping layer 
    // you could do the mapping here as well. 
    BarViewModel viewModel = Mapper.Map<Bar, BarViewModel>(domainModel); 

    // The controller passes a view model to the view 
    return View(viewModel); 
} 

:

[AutoMap(typeof(Bar), typeof(BarViewModel))] 
public ActionResult Foo(int id) 
{ 
    Bar domainModel = Repository.Get(id); 
    return View(domainModel); 
} 

AutoMap özel eylem filtresi OnActionExecuted olayı abone, görünüm sonucuna geçirilen modeli kesiştirir, bir görünüm modeline dönüştürmek ve görünüm için yerine koymak için eşleme katmanı (benim durumumda AutoMapper) çağırır. Görüş, elbette görünüm modeline güçlü bir şekilde yazılmıştır.

+0

ty çok. Automapper'ı bilmiyordum. Sorunumda ihtiyacım olan şey bu. –

+0

Özel eylem filtresi yaklaşımı test edilebilir mi? Bu, bir ünite testinden çağrıldığında otomatik haritalayıcı nasıl çalışır? –

+1

@JoshuaBarker, bir birim sınamasının tüm noktası, bir işlevselliği yalıtılmış olarak sınamanızdır. Peki, burada yalnız olarak test etmek istediğin şey nedir? AutoMap özelliği? Harika, devam edin ve bunun için bir birim testi yazın. Ya da etki alanı modelini görüntüye geçiren denetleyici eyleminiz mi? Harika, devam edin ve bunun için bir birim testi yazın. Veya denetleyici eyleminizin AutoMap özniteliği ile süslenmiş olması gerçeği? Harika, devam edin ve bunun için bir birim testi yazın. Şimdiye kadar, denetleyici eyleminizin beklendiği gibi çalışacağını doğrulamak için ihtiyacınız olan her şeyle 3 birim testi yazdınız. –

2

Deponuzun iş modelini döndürmesi gerektiğini düşünüyorum.

Ardından özellikleri otomatik olarak görüntü modelinize eşlemek ve el ile eşleme kodundan kurtulmak için Automapper gibi bir aracı kullanabilirsiniz. Bu yaklaşım, tüm işletme entitie özelliklerini ifşa etmek istemezseniz ya da görünümün yapısına uyum sağladığında çok yararlıdır.

Ayrıca, post, el ile haritalama çağrıları (tür) kurtulmak ve aynı zamanda viewmodels vb (benim düşünceme göre) kullanmak nasıl iyi bir örnek sağlar - veya en azından bir çeşit olsun yararlı bulabilirsiniz İlham yayından

alıntı (özelliği ViewModel dönüşüm formu busioness modeli yapar):

[AutoMap(typeof(Product), typeof(ShowProduct))] 
public ActionResult Details(int id) 
{ 
    var product = _productRepository.GetById(id); 

    return View(product); 
} 
+0

ty çok fazla. Darin'in cevabı biraz detaylı, bu yüzden cevabını kabul ediyorum. Umarım sakıncası yoktur. –

+0

Teşekkürler, bu güzel. Bilgileriniz için teşekkür ederim - Darin'in cevabının aynı içeriğe sahip olduğuna, ancak daha iyi sunacağına katılıyorum (ve bu nedenle daha iyi bir cevap). Bağlantıyı okumanızı öneririm, çünkü Viewmodels vb. Diğer ilginç bilgiler olabilir. –

+0

Teşekkürler. Şu anda bunu okuyorum :) –

İlgili konular