2011-07-21 17 views
6

Potrzebuję pomocy w specjalnym mapowaniu za pomocą programu AutoMapper. Chcę zmapować kolekcję obiektów do kolekcji ciągów.AutoMapper: Mapowanie kolekcji obiektów do kolekcji ciągów znaków

więc mam Tag classd

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

niż w modelu mam IList tej klasy. Teraz chcę zmapować nazwę do kolekcji ciągów.

Ów jak zdefiniować regułę mapowania:

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

I tu jest moje ValueResolver:

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

Ale u know .. to nie pracy ;-) Więc może ktoś wie jak to zrobić to prawda i może mi pomóc.

thx dużo

Jan

taaak .. u chciał więcej szczegółów .. tutaj u get it .. ale mam skrócić;)

więc model:

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

I model Tag u można zobaczyć powyżej.

Chcę go odwzorować na widok artykułu ... Potrzebuję modelu tagu tylko w kontekście biznesowym, a nie do wyjścia.

Więc tutaj jest ViewModel muszę map do:

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 :-) 
} 

Więc mam inicjującego dla odwzorowań. Moje mapowania wygląda następująco:

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

I mapować manuelly specjalną metodą

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

Czy możesz podać więcej informacji o klasach źródłowym i docelowym? –

+0

Więc to wszystko robię :) Mam nadzieję, że moje wydanie może pomóc :) – Smokefoot

Odpowiedz

13

Test jednostkowy zatwierdzone następujące byłoby map z IList <Tag> do IList <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; 
      } 
     } 

To jest krótszy sposób tworzenia mapy:

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

Cholera .. jego takie łatwe^^ dziękuję bardzo dużo myśli o tym w ten sposób: D * wstyd * – Smokefoot

+0

Twoje powitanie. Dodałem też krótką opcję. –

+1

Och, twoja druga opcja jest świetna. Dziękuję bardzo. – Smokefoot

Powiązane problemy