Verwenden AutoMapper, aus der die Zuordnung einer Schnittstelle zu einem konkreten Typ

Ich habe ein dotNetFiddle zeigt, dass die Frage hier.


Hier ist ein Vereinfachtes Beispiel, was ich versuche zu tun... sagen wir mal ich habe eine der folgenden Schnittstellen:

public interface IPerson
{   
    int Id { get; set; }     
}

public interface IModelPerson : IPerson
{
    int BeautyCompetitionsWon { get; set; }
}

In der realen Umsetzung gibt es viele verschiedene Arten von Menschen (z.B. IUglyPerson, etc). Diese sind die Verträge für entity-Typen, z.B. wie folgt:

public class PersonEntity : IPerson
{
    public int Id { get; set; }
}

public class ModelPersonEntity : PersonEntity, IModelPerson
{
    public int BeautyCompetitionsWon { get; set; }
}

Hinweis: Wir können auch mehrere Implementierungen von jedem Vertrag geben - z.B. IModelPerson kann ebenfalls implementiert werden, indem SupermodelEntity.

Wollen wir anzeigen unsere entity-Typen zu DTOs, die wie folgt Aussehen:

public abstract class PersonDto : IPerson
{
    public int Id { get; set; }
    public abstract string PersonType { get; }
}

public class ModelPersonDto : PersonDto, IModelPerson
{
    public int BeautyCompetitionsWon { get; set; }
    public override string PersonType
    {
        get { return "Model"; }
    }
}

Als solche, wir erstellen ein mapping:

Mapper.Initialize(config =>
{
    config.CreateMap<IPerson, PersonDto>()
        .Include<IModelPerson, ModelPersonDto>()
        .ConstructUsing((IPerson person) => 
        {
            if (person is IModelPerson) return new ModelPersonDto();

            throw new InvalidOperationException("Unknown person type: " + person.GetType().FullName);
        })
        ;

    config.CreateMap<IModelPerson, ModelPersonDto>();
});

So, ich habe hier zwei Probleme.

1. Gibt es eine Möglichkeit, die Erstellung der mappings ohne die ConstructUsing - Klausel? Ich dachte, dass die mehr spezifische version von CreateMap haben möchte, erledigt dies für uns, aber wenn ich nicht über die ConstructUsing Klausel, AutoMapper sagt mir "Instanzen von abstrakten Klassen können nicht angelegt werden".

2. Warum nicht die Eigenschaften von meinem Unterklassen zugeordnet bekommen? Wenn ich ausführen einer Zuordnung wie folgt:

var source = new ModelPersonEntity { Id = 100, BeautyCompetitionsWon = 9 };
var target = Mapper.Map<PersonDto>(source);

Den erwarteten Wert für target.BeautyCompetitionsWon ist 9, aber der tatsächliche Wert ist 0.

InformationsquelleAutor gerrod | 2015-12-29
Schreibe einen Kommentar