Frage AutoMapper: Zuordnen einer Auflistung von Object zu einer Auflistung von Zeichenfolgen


Ich brauche Hilfe bei einem speziellen Mapping mit AutoMapper. Ich möchte eine Sammlung von Objekten einer Zeichenkettensammlung zuordnen.

Also habe ich einen Tag klassifiziert

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

Als in einem Modell habe ich eine IList dieser Klasse. Jetzt möchte ich den Namen einer Sammlung von Strings zuordnen.

So definiere ich die Zuordnungsregel:

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

Und hier ist mein ValueResolver:

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

Aber du weißt es funktioniert nicht ;-) Vielleicht weiß jemand, wie man es richtig macht und kann mir helfen.

vielen Dank

Jan

Sooo .. du wolltest mehr Details .. hier bekommst du es .. aber ich habe es gekürzt;)

Also das Modell:

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

Und das Tag-Modell kann man oben sehen.

Ich möchte es zu einem ArticleView zuordnen ... Ich brauche das Tag-Modell nur für einen geschäftlichen Kontext, nicht für die Ausgabe.

Also hier ist das ViewModel, das ich zuordnen muss:

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

Also habe ich einen BootStrapper für die Mappings. Mein Mapping sieht so aus:

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

Und ich mappe es manuell mit einer speziellen Methode

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

7
2017-07-21 19:42


Ursprung


Antworten:


Ein Komponententest validiert Folgendes: würde von IList abbilden<Tag> zu 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;
            } 
        }

Dies ist ein kürzerer Weg zum Erstellen der Karte:

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

15
2017-07-21 20:47