2011-11-08 18 views
16

ile çocuk koleksiyonunun eşlenmesi Çok fazla bir soru değil, istediğimi yapmanın bir yolunu bulduğumdan, ama bunu yapmanın daha iyi bir yolu olmalı. Her yerde aradım ve hiçbir şey bulamadım.AutoMapper

Temel olarak, çok standart bir nesne modelini düşündüğüm var.

public class Parent 
{ 
    private readonly IList<Child> _children = new List<Child>(); 
    public IEnumerable<Child> Children { get { return _children; } } 
    public void AddChild(Child child) 
    { 
     child.Parent = this; 
     _children.Add(child); 
    } 
} 

ve

public class Child 
{ 
    public Parent Parent { get; set; } 
} 

(Sorun ve hata kontrolü için alakasız ve açıklık bakımından koruma özelliklerini ihmal ettik ...)

public class ParentDTO 
{ 
    List<ChildDTO> Children = new List<ChildDTO>(); 
} 

ve

public class ChildDTO 
{ 
} 

Çocukları koleksiyona eklemek için bir yöntem kullanmamın nedeni, bir çocuk eklendiğinde işlenmesi gereken iş mantığının denetimini sağlamaktır. standart haritalama ile

:

Mapper.CreateMap<Parent, ParentDTO>(); 
Mapper.CreateMap<ParentDTO, Parent>(); 
Mapper.CreateMap<Child, ChildDTO>(); 
Mapper.CreateMap<ChildDTO, Child>(); 

hizmet katmanından gelen iyi çalışıyor gibi görünüyor. Etki alanı nesnesinin çocukları mükemmel bir şekilde ChildDTO örnekleri listesine eşler. Ancak, başka bir şekilde yeniden eşleştirilirken, etki alanı modelindeki koleksiyon ayarlanmamıştır - çünkü açıkçası, açıktır. AutoMapper kullanarak özel alanı doğrudan ayarlamak için herhangi bir yol görünmüyor. Burada ve internetin diğer bölümlerinde bulunan çeşitli önerileri denedim. Sonunda

, şu haritalama ile geldi:

Mapper.CreateMap<ParentDTO, Parent>() 
    .ForMember(m => m.Children, o => o.Ignore()) 
    .AfterMap((s, d) => 
         { 
          foreach(var c in s.Children) 
           d.AddChild(Mapper.Map<ChildDTO, Child>(c)); 
         }); 

Bu benim gerektiği gibi çalışır. Bununla birlikte, daha iyi bir yolun olması gerektiğini hissetmeme yardımcı olamıyorum ve bunu çocukları modifiye edilmiş ve belki de eklenmiş ve kaldırılmış olan var olan bir ebeveynle test etmedim, bu yüzden henüz doğru olmadığını biliyorum. Nihayetinde, bu alan modeli NHibernate kullanılarak kalıcıdır, bu yüzden bunun için endişelenmeliyim. Ama, her seferinde bir şey. Umarız bu, aynı sorunla karşılaşan başka birine yardımcı olabilir ve belki de uygun bir şekilde çözmüş biri beni düzeltecektir.

+2

+1 sonrası çözümünüz beni kurtardı. –

+0

Soğuk çözüm. Ödünç alacağım :-) – LeftyX

+0

AfterMap ile harika bir fikir. Kaynak ve Hedef nesneler ile ResolutionResult ve bunun gibi şeyler ile çalışmak çok daha kolay! – Andrei

cevap

0

İyi iş mantığı nedenleriyle özellikleri koruyacak olursanız, AutoMapper eşleme yaparken bunları atlatması kötü olur. Sonra

private Parent MapParentDTOToParent(ParentDTO source) 
{ 
    var parent = new Parent(); 
    // Business logic here 
    return parent 
} 

ve: Bu gibi durumlarda ben akıcı sözdizimi terk edip böyle kendi yönteminde oluşturma mantığı yerleştirmek için tercih

Mapper.CreateMap<ParentDTO, Parent>().ConvertUsing(MapParentDTOToParent); 

ben çok sahip daha izleyin daha kolay olduğunu beyanları dikkate almayın.