2013-06-13 16 views
10

Mam usługi, które wywołują inne usługi. Obie usługi korzystają z "tych samych klas". Klasy są nazywane same i mają te same właściwości, ale mają inną przestrzeń nazw, więc muszę użyć AutoMappera, aby odwzorować jeden z typów na inny typ.AutoMapper auto create createMap

Nie jest to całkiem proste, ponieważ wszystko, co muszę zrobić, to CreateMap<>, ale problem polega na tym, że mamy około setek klas, które ręcznie muszę napisać od CreateMap<>, i to działa na mnie. Czy nie ma funkcji Auto CreateMap? Więc jeśli mówię CreateMap(), to AutoMapper działa przez Organizację i znajduje wszystkie klasy i automatycznie robi CreateMap dla tych Klasy i jego podklas itp. Etc ...

Mam nadzieję, że proste rozwiązanie, lub myślę, że niektóre odbicie może to naprawić ..

Odpowiedz

4

AutoMapper ma metodę DynamicMap, której możesz użyć: oto przykładowy test jednostkowy ilustrujący to.

[TestClass] 
public class AutoMapper_Example 
{ 
    [TestMethod] 
    public void AutoMapper_DynamicMap() 
    { 
     Source source = new Source {Id = 1, Name = "Mr FooBar"}; 

     Target target = Mapper.DynamicMap<Target>(source); 

     Assert.AreEqual(1, target.Id); 
     Assert.AreEqual("Mr FooBar", target.Name); 
    } 

    private class Target 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    private class Source 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 
+1

DynamicMap jest już nieaktualne, a 'Mapper.Map (foo, zdecyduje => opts.CreateMissingTypeMaps = true)' jest zalecaną alternatywę. – PeteGO

17

Wystarczy ustawić CreateMissingTypeMaps true w opcjach:

var dto = Mapper.Map<FooDTO> 
    (foo, opts => opts.CreateMissingTypeMaps = true); 

Jeśli trzeba go używać często, przechowywania lambda w polu Delegat:

static readonly Action<IMappingOperationOptions> _mapperOptions = 
    opts => opts.CreateMissingTypeMaps = true; 

... 

var dto = Mapper.Map<FooDTO>(foo, _mapperOptions); 

UPDATE :

The proach opisane powyżej nie działa już w najnowszych wersjach AutoMapper.

Zamiast tego, należy utworzyć konfigurację odwzorowujący z CreateMissingTypeMaps ustawiony na true i utworzyć instancję odwzorowujący od tej konfiguracji:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMissingTypeMaps = true; 
    // other configurations 
}); 
var mapper = config.CreateMapper(); 

Jeśli chcesz nadal używać starej statycznej API (nie zalecane), ty może to również zrobić:

+0

Czy jest to ustawienie globalne? –

+0

@ChadKapatch, nie żebym wiedział o –

+0

@ThomasLevesque: nie działa dla mnie, daje taki błąd, nie zawiera definicji "CreateMissingTypeMaps" i nie można znaleźć metody rozszerzenia akceptującej pierwszy argument typu. dowolny pomysł? – Bharat

2

CreateMissingTypeMaps można ustawić w swoim profilu. Zaleca się jednak jawne użycie CreateMap dla każdego mapowania i wywołanie AssertConfigurationIsValid w testach jednostkowych dla każdego profilu, aby zapobiec cichym błędom.

public class MyProfile : Profile { 
    CreateMissingTypeMaps = true; 

    // Mappings... 
} 
+0

tylko to działało dla mnie, ustawiając to podczas Mappera.Inicjalizacja nie działa. – aeroson