2016-03-20 9 views
1

Wir verwenden Automapper für einige Zeit und wir denken, es ist ein großer Nutzen, danke für die Erstellung!Wie wird mit Automapper auf interne Eigenschaften abgebildet?

Wir haben jedoch eine Frage:

Frage

„Wie wird AutoMapper eine Quelleigenschaft an einen internen Ziel Eigenschaft zur Karte?“

Hintergrund

In unserer geschichteten Architektur, Objekte Dto nie verlassen werden, um die Datenzugriffsschicht, nur Domain-Objekte erlaubt in die und aus der Datenzugriffsschicht zu übergeben. Daher sollten Domänenobjekte von einer Domänen-POV kein Datenbankwissen enthalten. In der Praxis sind Datenbank-IDs jedoch sehr nützlich, um sie herumzutragen - erwarten Sie, dass der Business-Layer-Entwickler nichts über sie wissen sollte.

Lösung: Fügen Sie die Datenbank-IDs zum Domänenobjekt hinzu, aber vermarkten Sie sie als intern, sodass sie nicht der 'Business-Schicht' ausgesetzt sind. Setzen Sie anschließend die Interna der Common-Ebene (die die Domänenobjekte besitzt) für die Datenzugriffsebene frei. Problem gelöst. Erwarten Sie, dass wir nicht herausfinden können, wie man Automapper (> v3.3.0) mit unseren internen Eigenschaften arbeiten kann.

In, Version 3.3.0 BindingFlags wurden ausgesetzt, die das Problem zu lösen.

Beispiel

Common.Dll

public class Person 
{ 
    public Parent Father { get; set; } 
    internal int FatherId {get; private set; } 
} 

DataAccess.dll

internal class PersonDto 
{ 
    public ParentDto Father { get; set; } 
    public int FatherId {get; private set; } 
} 

In unserem Profil Klasse haben wir CreateMap<PersonDto, Person>();

Edit 1 - Ein Tippfehler im Rückgabetyp von Vater wurde korrigiert.

Edit 2 - Added mehr Informationen ..

Im Common.Dll haben wir Dienstleistungen etwas wie folgt aus:

public class ParentService 
{ 
    public Parent GetFather(Person person) 
    { 
     return repo.Parents.FirstOrDefault(parent => parent.Id = person.Father.Id); 
    } 
} 

Und im Business.Dll haben wir Entwickler der Nutzung der Dienste so etwas wie diese:

var father = parentService.GetFather(son); 
// use father separately or assign it to the son. Like so: 
// son.Father = father; 

der springende Punkt ist, dass wir nicht wollen, dass das Geschäft Entwickler Zugang zuhabenvon der Businsess.Dll noch haben sie Zugriff auf das Dto-Objekt, das das Domänenobjekt erstellt.

So wird das gesamte 'Datenbank' Wissen in den verschiedenen Common.dll Services oder in der DataAccess.dll gekapselt.

Danke.

Antwort

0

Diese Frage wird beantwortet here.

Ich zitiere die Antwort für Ihre Bequemlichkeit:

Stellen Sie einfach die ShouldMapProperty Eigenschaft Ihrer Konfigurationsobjekt in der Methode initialize.

Hier ist ein Beispiel für die Verwendung der statischen API. Sie sollten jedoch in ähnlicher Weise erreichen können, indem Sie die nicht statische API verwenden.

Mapper.Initialize(i => 
{ 
    i.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly; 
    i.CreateMap<Source, Target>();     
}); 
Verwandte Themen