2010-05-23 16 views
10

Model (Etki Alanı) nesnelerini, Görünümlerim tarafından tüketilen ViewModel nesnelerine Model/Görünüm/Görünüm Modeli deseninde eşlemek için sıklıkla OtomatikMapper kullanıyorum.'CreateMap' ifadeleri nereye gitmeli?

Bu, tümünün çalıştırılması gereken birçok 'Mapper.CreateMap' ifadesini içerir, ancak uygulamanın yaşam döngüsünde yalnızca kez çalıştırılmalıdır.

Teknik olarak o zaman, hepsini Application_Start() yönteminden çağrılan statik bir yöntemde tutmalıyım (bu bir ASP.NET MVC uygulamasıdır). Bununla birlikte, bir çok farklı haritalama sorununu tek bir merkezi konumda bir araya getirmenin yanlış olduğu görülmektedir. Özellikle eşleme kodu karmaşıklaştığı ve biçimlendirme ile diğer mantığı içerdiğinde.

Eşleme kodunu düzenlemenin daha iyi bir yolu var mı? Böylece, ilgili ViewModel'e yakın tutuluyor mu? örneği başlatıldığında, bu yöntemin çağrılması BaseViewModel her ViewModel bir 'CreateMappings' yöntemi olan ve ancak yöntem yalnızca uygulama yaşam döngüsü içinde kez denilen edilmesi gerektiğinden, -

(Bir fikir geldi. CreateMappings yönteminin çağrıldığı ViewModel türlerinin bir listesini önbelleğe almak için bazı ek mantıklara gereksinim duyar ve o zaman bu listede olmayan ViewModels için yalnızca gerektiğinde bunu çağırır.)

cevap

2

Profilleri kullanırsanız, Tüm "CreateMap" çağrılarınızı oraya yerleştirebilirsiniz. Ayrıca, yapılandırmanızı içeren bir statik önyükleyici sınıfı oluşturabilir ve başlangıç ​​parçasının yalnızca önyükleyiciyi çağırabilirsiniz.

+0

Ama yine aynı kefeye tüm farklı görüntüleme modelleri için tüm eşleştirmeleri sahip sorununu çözmez, ben tercih ederdim ne zaman Bir şekilde başvurdukları sınıflarla ilgili. – Jonathan

0

Tamam, Şu anda bunu yapıyorum yolu şudur:

:

Ben 'CreateMappings' yöntemini çalıştırır benim BaseController, kurucusuna bazı mantığı ekleyebilirsiniz, ancak sadece bir kez Kontrolör Türlerinde

public abstract class BaseController : Controller 
{  
    public BaseController() 
    { 
     if (!controllersWithMappingsCreated.Contains(GetType())) 
     { 
      CreateMappings(); 
      controllersWithMappingsCreated.Enqueue(GetType()); 
     } 
    } 

    protected virtual void CreateMappings() { } 
} 

Her bir beton denetleyicide, bu denetleyiciyle ilgili tüm Modeller/GörünümModelleri için eşlemeleri bildirmek için CreateMappings kullanıyorum.

public class AccountController : BaseController 
{ 
    public AccountController() : base() { } 

    protected override void CreateMappings() 
    { 
     Mapper.CreateMap<Models.User, ViewModels.UserProfile>(); 
     Mapper.CreateMap<Models.User, ViewModels.ChangePassword>(); 
    } 
} 

Ben de here ve here, ancak onlar biraz overcomplicated gibi geldin Nitelikleri içeren bazı ilginç alternatifler buldum.

+2

Hala bir statik bootstrapper sınıfım var, bu yüzden eşleştirmelerinizi açığa çıkarabilirsiniz. – Martin

+0

Güzel iş. Ama 'BaseController' içinde' controllersWithMappingsCreated' nedir? – Blaise

6

Gerçekten bir bootout kullanmak istemiyorsanız, en azından bir statik kurucu, CreateMap'inizin bir defada çağrılmasını sağlamanın kolay bir yoludur. (Daha az Jonathan'ın cevap daha etrafında ve daha iplik geçirmez karıştırmasını ile.)

public class AccountController : Controller 
{ 
    static AccountController() 
    { 
     Mapper.CreateMap<Models.User, ViewModels.UserProfile>(); 
     Mapper.CreateMap<Models.User, ViewModels.ChangePassword>(); 
    } 
} 
+0

Eşleştirmeleri statik yapıcıya koyma konusunda hiç şansım olmadı. Bunları örnek kurucuya koymam gerektiğini anladım. – AaronLS

+0

@AaronLS Oh no. Bir istisna ya da bunun gibi bir şey var mı? Kurucular ve eşleştirmeler için hangi sınıfları kullanıyorsunuz? –

İlgili konular