2012-11-13 7 views
12

mam sporo podmiotów i do tej pory robiłem takie rzeczyCzy możesz powiedzieć, że AutoMapper globalnie ignoruje brakujące właściwości podczas mapowania?

Mapper.CreateMap<Employee, EmployeeDetailsDTO>() 
    .ForSourceMember(mem => mem.NewsPosts, opt => opt.Ignore()); 

Chcę powiedzieć AutoMapper po prostu zignorować właściwości brakuje obiektu docelowego bez konieczności określania każdego z nich. Do tej pory nie znalazłem sposobu, aby to zrobić z wieloma wyszukiwaniami w SO i Google. Ktoś ma rozwiązanie? Jestem gotowy do zrobienia jakiejś pętli lub czegoś podobnego, o ile można go zapisać raz i że skaluje się ze zmianami modelu/dto lub dodanymi właściwościami.

Odpowiedz

7

Kiedy otrzymujesz błąd? Czy to podczas dzwonienia pod numer AssertConfigurationIsValid?

Jeśli tak, to prostu nie nazywają to metoda

Nie musisz wywołać tę metodę, należy rozważyć następujące odwzorowanie który działa:

public class Foo1 
{ 
    public string Field1 { get; set; } 
} 
public class Foo2 
{ 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

Mapper.CreateMap<Foo1, Foo2>(); 
var foo1 = new Foo1() {Field1 = "field1"}; 
var foo2 = new Foo2(); 
Mapper.Map(foo1, foo2);//maps correctly, no Exception 

Możesz zadzwonić AssertConfigurationIsValid dla drugiej mapowania, aby upewnić się, że są poprawne, a zamiast tego należy uporządkować swoje odwzorowania w profile:

public class MyMappedClassesProfile: Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Foo1, Foo2>(); 
     //nb, make sure you call this.CreateMap and NOT Mapper.CreateMap 
     //I made this mistake when migrating 'static' mappings to a Profile.  
    } 
} 

Mapper.AddProfile<MyMappedClassesProfile>(); 

a następnie, jeśli zdecydujesz, że chcesz sprawdzić poprawność odwzorowania (indywidualnie dla każdego przypadku w danej sytuacji), a następnie zadzwonić

Mapper.AssertConfigurationIsValid(typeof(MyMappedClassesProfile).FullName); 

ważną w Twoim przypadku i/lub każdy przypadek, w którym dont zadzwoń pod numer AssertConfigurationIsValid powinieneś użyć czegoś takiego jak AutoFixture i testu jednostki, aby upewnić się, że twoje mapowanie działa. (który jest celem: AssertConfigurationIsValid)

+0

To jest, gdy nazywam AssertConfigurationIsValid, ale chciałbym to zrobić, aby zachować to w moich testach jednostkowych. W tej chwili jest w Global.asax, ale ostatecznie przejdzie w testowaniu jednostkowym (to aplikacja ASP.NET MVC). Więc zasadniczo mówisz mi, że powinienem unikać używania AssertConfigurationIsValid i napisać własne testy jednostkowe dla mojego DAL? – Pluc

+0

Nie mówię, żebyś to robił w * każdym * przypadku ... w miejscach, w których mapowanie jest proste, nadal używaj AssertConfigurationIsValid. W miejscach, w których staje się problematyczne, ponieważ wiesz lepiej, nie używaj go. Powinieneś jednak uporządkować swoje odwzorowania na Profile (klasy rozszerzające 'AutoMapper.Profile'), ponieważ ten rodzaj-redukuje statyczną naturę konfiguracji odwzorowań i wywołanie do' AssertConfigurationIsValid ', które następnie miałyby zastosowanie do każdej deklaracji Mapper.Map, że" zrobione. – wal

+0

Każda jednostka będzie mieć brakujące właściwości, ponieważ odwzorowuję EF POCO na DTO. DTO nigdy nie będą zawierać innych DTO, ale raczej zachowają identyfikatory (relacje jeden-jeden/jeden-wiele) lub wywołają odpowiednie repozytorium odpowiedzialne za żądaną jednostkę (z jego identyfikatorem jako parametrem).Niektóre są tylko jedną brakującą własnością, ale wszystkie mają co najmniej jedną. Nie jestem pewien, czy użycie Profili przyniesie mi wiele, ponieważ odwzorowania są skonfigurowane tylko raz (ponieważ jest to aplikacja internetowa) po uruchomieniu serwera WWW. Używam również AutoMappera dla Model => DTO. O ile nie zacznę używać go do ViewModels, nie widzę potrzeby. – Pluc

3

Sugerowany w wal's answer "nie wywoływać AssertConfigurationIsValid()" nie jest bezpieczny, ponieważ ukryje potencjalne błędy w odwzorowaniach.
Lepiej jawnie ignorować odwzorowanie między klasami, dla których masz pewność, że wszystkie wymagane właściwości zostały poprawnie odwzorowane. Można używać rozszerzeń utworzonych w AutoMapper: "Ignore the rest"? odpowiedź:

var config = new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<Src, Dest>(); 
    cfg.IgnoreUnmapped<Src, Dest>(); // Ignores unmapped properties on specific map 
}); 

Sposób cfg.IgnoreUnmapped ignoruje właściwości unmapped na wszystkich mapach i nie jest zalecane, ponieważ również skrywa wszelkie potencjalne problemy dla wszystkich klas.

Powiązane problemy