2011-07-21 18 views
6

AutoMapper ile özel bir haritalamayla ilgili yardıma ihtiyacım var. Nesnelerin bir koleksiyonunu bir dizi koleksiyona eşlemek istiyorum.AutoMapper: Nesnelerin bir koleksiyonunu dize koleksiyonuna eşleştirilmesi

Yani ben bir Etiket ben bu sınıfın bir IList sahip bir modelde daha

public class Tag 
{ 
    public Guid Id { get; set; } 
    public string Name {get; set; } 
} 

classd var. Şimdi isimleri bir dizi koleksiyona eşlemek istiyorum. Ben eşleme kuralı tanımlamak nasıl

Thats: Burada

.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>()) 

Ve ValueResolver geçerli:

protected override string ResolveCore(Tag source) 
{ 
    return source.Name; 
} 

Ama u biliyorum .. o dont iş ;-) Yani belki birisi nasıl yapılacağını biliyorum Doğru ve bana yardımcı olabilir.

thx ..

Oca

SOOO sürü u daha fazla ayrıntı istedi .. Burada u almak .. ama onu kısaltmak var; Yani Modeli)

:

public class Artocle 
{ 
    public Guid Id { get; set; } 
    public string Title {get; set; } 
    public string Text { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

Ve Tag modelini yukarıda görebilirsiniz.

Bunu bir ArticleView ile eşlemek istiyorum ... etiket modeline, yalnızca bazı iş içerikleri için değil, çıktı için ihtiyacım var.

public class ArticleView 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public IList<string> Tags { get; set; } // The mapping problem :-) 
} 

Yani eşleştirmeleri için bir Bootstrapper vardır: Yani burada

i eşlemek gerek ViewModel olduğunu. Benim Haritalama şöyle görünür:

Mapper.CreateMap<Article, ArticleView>() 
.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>()) 

Ve özel bir yöntemle

public static ArticleView ConvertToArticleView(this Article article) 
    { 
     return Mapper.Map<Article, ArticleView>(article); 
    } 
+0

Kaynak ve hedef sınıfları hakkında daha fazla bilgi verebilir misiniz? –

+0

Yani hepsi bunu yaparım :) Umarım baskım yardımcı olabilir :) – Smokefoot

cevap

13

ile manuelly eşlersiniz bir birim test valide IList <Tag> den <string>

private class TagNameResolver : ValueResolver<IList<Tag>, IList<string>> 
     { 
      protected override IList<string> ResolveCore(IList<Tag> source) 
      { 
       var tags = new List<string>(); 
       foreach (var tag in source) 
       { 
        tags.Add(tag.Name); 
       } 
       return tags; 
      } 
     } 

IList karşılık gelecek aşağıdaki Bu, haritayı oluşturmanın daha kısa bir yoludur:

.ForMember(dest => dest.Tags, opt => opt.MapFrom(so => so.Tags.Select(t=>t.Name).ToList())); 
+1

Lanet olsun .. bu kadar kolay ^^ Bu konuda çok fazla düşünce var: D * ayıp * – Smokefoot

+0

Hoş Geldiniz. Ben de kısa bir seçenek ekledim. –

+1

Oh, ikinci seçeneğin harika. Çok teşekkür ederim. – Smokefoot