Automapper 4.2.1 LINQ-Projektionen funktionieren nur mit statischer Mapper.CreateMap?

9

Ich versuche, Automapper-Projektionen auf Entity Framework IQueryables zu verwenden.

Beim Start der Anwendung erstelle ich alle meine Zuordnungsprofile, die Karten mit der nicht statischen CreateMap-Methode erstellen, und füge sie hinzu.

Alle diese Profile sind in meinem IoC-Container registriert.

Ich erhalte die fehlende Mapping-Ausnahme, obwohl ich das Mapping-Profil in der Instanz meiner mappingConfiguration sehe.

Was könnte das Problem sein? Fehle ich etwas? Ich benutze Automapper 4.2.1

Ich habe festgestellt, dass es beim Hinzufügen einer statischen Mapper.CreateMap funktioniert. Funktionieren Projektionen nur mit statischer API? Ich möchte die statische API vermeiden.

Vollständiger Code:

%Vor%     
S. Peter 12.04.2016, 07:19
quelle

1 Antwort

10

Der Grund ist der folgende Block:

%Vor%

source.ProjectTo ist eine Erweiterungsmethode mit 5 Überladungen. In der Dokumentation übergeben sie die Instanz von MappingConfiguration class und übergeben die Instanz von IMapperConfiguration (interface). Sie denken, dass es den gleichen Effekt haben wird, aber es nicht tut. IMapperConfiguration interface implementiert nicht IConfigurationProvider interface, und das ( IConfigurationProvider ) ist die korrekte Überladung von ProjectTo . Aber es gibt eine weitere Überladung von ProjectTo , die " object parameters " akzeptiert. Weil es ein Objekt akzeptiert - es passt alles an, was nicht zu anderen Überladungen passt. Was Sie wirklich aufrufen, ist ProjectTo(object) overload, was nichts mit Konfiguration zu tun hat, und Ihr IMapperConfiguration zusammen mit Profilen und Maps wird komplett ignoriert.

Quickfix wird

sein %Vor%

Aber natürlich solltest du deine Konfiguration besser als IConfigurationProvider in deinem Container registrieren, das ist nur eine schnelle Lösung, um sicherzustellen, dass das Problem wirklich hier ist.

Wie bei static Mapper.CreateMap - nun, es ist statisch, funktioniert also unabhängig davon, was Sie an ProjectTo übergeben.

Als eine Randnotiz zeigt Ihnen, wie Sie nicht api entwerfen. Immer wenn Sie viele Überladungen haben und eine von ihnen ein generisches Objekt annimmt und vollständig eine andere Sache als alle anderen Überladungen tut - das bedeutet Ärger.

    
Evk 16.04.2016, 22:13
quelle