2017-01-31 2 views
1

Also das Problem ist ziemlich einfach, aber ich kann einfach keinen Weg zur Lösung sehen.Mehr als 1 AutoMapper Konfiguration in Multi-Projekt-Lösung

In meiner Lösung habe ich eine DAL-Schicht (Klassenbibliothek), eine DTO-Schicht (Klassenbibliothek) und ein MVC-Projekt.

Die Idee ist, dass die MVC-App Elemente von der DTO-Schicht anfordert, die wiederum Elemente von der DAL-Schicht erhält. Einfach genug.

In der DTO-Schicht habe ich Repositories mit einem Kontext, um sie zu verwalten. Daher erstellt die MVC-Anwendung eine Instanz des DTO-Kontexts und ruft dann DTO-Entitäten aus dem entsprechenden Repository ab.

Jetzt für das Problem.

In der DTO-Ebene verwende ich AutoMapper, um die zugrunde liegenden Entitäten zu DTOs zuzuordnen, und in der MVC-App plante ich, es erneut zu verwenden, um die DTOs auf ViewModels und zurück abzubilden.

So rufen Sie im Konstruktor des Kontexts in der DTO-Ebene die statische RegisterMappings(), um die Zuordnungen zwischen den zugrunde liegenden Entitäten und den DTOs zu registrieren. Keine Probleme bisher.

jedoch im Global.asax der MVC-app Ich nenne auch RegisterMappings() (aus einer anderen Klasse zu dem in der DTO-Schicht) noch, wenn ich versuche, von einem Ansichtsmodell zu DTO in der MVC-app ich die Missing type map configuration or unsupported mapping Ausnahme erhalten abzubilden.

Beim Betrachten der Ausnahmen von AssertConfigurationIsValid() kann ich sehen, dass der Autoadapter immer noch die Zuordnungen zwischen den Schichten DAL und DTO, nicht die Schichten DTO und MVC App erwartet.

Wie verwende ich Autoadapter in 2 separaten Projekten innerhalb der gleichen Lösung, ohne diese "blutende" Wirkung von Mappings zu bekommen?

Alle Ideen werden sehr geschätzt.

+1

Verwenden Sie AutoMapper 5 oder später? Dann denke ich, dass Sie jede Konfiguration separat speichern können und verwenden Sie 'config.CreateMapper();', anstatt die statischen Mapper-Aufrufe zu verwenden, um einen Mapper für jede Ebene zu erstellen. – stuartd

+0

@stuartd das zu einer Antwort ändern. Arbeitete perfekt für mich. –

+0

Fertig, danke ... – stuartd

Antwort

1

können Sie die Zuordnungen trennen halten, indem sie die AutoMapper Konfiguration in jedem Projekt zu speichern und dann die Konfiguration mit dem Mapper zu erstellen:

// DTO project 
MapperConfiguration dtoConfig; 

dtoConfig = new MapperConfiguration(cfg => { 
    cfg.CreateMap<Foo, Bar>(); 
    cfg.AddProfile<DtoProfile>(); 
}); 

// MVC project 
MapperConfiguration mvcConfig; 

mvcConfig = new MapperConfiguration(cfg => { 
    cfg.CreateMap<Foo, Bar>(); 
    cfg.AddProfile<MvcProfile>(); 
}); 

Dann, wenn Sie eine Klasse zuordnen möchten, verwenden Sie die entsprechende config Erstellen Sie den Mapper:

var mapper = mvcConfig.CreateMapper(); 
mapper.Map<Foo, Bar>(foo);