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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage 1: Nicht, dass ich mir bewusst bin.
Frage 2: Bei der Verwendung der .ConstructUsing() stellen Sie sicher, dass Sie wieder das abgebildete Objekt, die Sie nach sind, anstatt eine neue Instanz.
z.B.