Czy istnieje sposób, aby powiedzieć AutoMapperowi, aby zignorował wszystkie właściwości oprócz tych, które są jawnie zmapowane?
Mam zewnętrzne klasy DTO, które mogą ulec zmianie z zewnątrz i chcę uniknąć jawnego ignorowania każdej właściwości, ponieważ dodanie nowych właściwości spowoduje uszkodzenie funkcji (spowoduje wyjątki) podczas próby odwzorowania ich na własne obiekty.
.net
automapper
Igor Brejc
źródło
źródło
.ForAllOtherMembers(opts => opts.Ignore())
AssertConfigurationIsValid()
połączenia) Z tego powodu uważam, że „Ignoruj resztę” jest antypatternem.Odpowiedzi:
Jest to metoda rozszerzenia, którą napisałem, która ignoruje wszystkie nieistniejące właściwości w miejscu docelowym. Nie jestem pewien, czy nadal będzie przydatny, ponieważ pytanie ma więcej niż dwa lata, ale natknąłem się na ten sam problem, ponieważ musiałem dodać wiele ręcznych połączeń Ignoruj.
Stosowanie:
AKTUALIZACJA : Najwyraźniej to nie działa poprawnie, jeśli masz niestandardowe mapowania, ponieważ je zastępują. Myślę, że to może nadal działać, jeśli najpierw wywołasz IgnoreAllNonExisting, a następnie niestandardowe odwzorowania później.
schdr ma rozwiązanie (jako odpowiedź na to pytanie), które wykorzystuje,
Mapper.GetAllTypeMaps()
aby dowiedzieć się, które właściwości nie są mapowane i automatycznie je ignorować. Wydaje mi się to bardziej niezawodnym rozwiązaniem.źródło
Z tego, co zrozumiałem, pytanie brzmiało, że w miejscu docelowym znajdują się pola, które nie mają zmapowanego pola w źródle, dlatego szukasz sposobów na zignorowanie tych niezamapowanych pól docelowych.
Zamiast implementować i używać tej metody rozszerzenia, możesz po prostu użyć
Teraz automapper wie, że musi tylko sprawdzić, czy wszystkie pola źródłowe są odwzorowane, ale nie na odwrót.
Możesz także użyć:
źródło
MemberList.Destination
rozwiązałoby problem operacyjny.Zaktualizowałem rozszerzenie Can Gencer, aby nie zastępowało żadnych istniejących map.
Stosowanie:
źródło
Mapper.GetAllTypeMaps()
jest przestarzałe)Mapper.GetAllTypeMaps()
zMapper.Configuration.GetAllTypeMaps()
. Oto odniesienie github.com/AutoMapper/AutoMapper/issues/1252Udało mi się to zrobić w następujący sposób:
Uwaga: używam AutoMapper v.2.0.
źródło
Wersja 5.0.0-beta-1 programu AutoMapper wprowadza
ForAllOtherMembers
metodę rozszerzenia, dzięki czemu możesz teraz to zrobić:Należy pamiętać, że jawne mapowanie każdej właściwości ma tę zaletę, że nigdy nie wystąpią problemy z cichym niepowodzeniem mapowania, które pojawiają się, gdy zapomnisz o mapowaniu właściwości.
Być może w twoim przypadku rozsądne może być zignorowanie wszystkich innych członków i dodanie
TODO
znaku „wracaj”, aby wyrazić je wyraźnie po ustaleniu częstotliwości zmian w tej klasie.źródło
ForAllOtherSourceMembers
?Od wersji AutoMapper 5.0
.TypeMap
właściwość nieIMappingExpression
działa, co oznacza, że rozwiązanie 4.2 już nie działa. Stworzyłem rozwiązanie, które korzysta z oryginalnej funkcjonalności, ale ma inną składnię:Realizacja:
źródło
CreateMap<TSource,TDest>()
wyrażeniu wProfile
?Minęło kilka lat, odkąd pytanie zostało zadane, ale ta metoda rozszerzenia wydaje mi się czystsza, używając bieżącej wersji AutoMapper (3.2.1):
źródło
Dla tych, którzy używają niestatycznego interfejsu API w wersji 4.2.0 i nowszej, można zastosować następującą metodę rozszerzenia (znajdującą się tutaj w
AutoMapperExtensions
klasie):Ważną rzeczą jest tutaj to, że po usunięciu statycznego interfejsu API kod taki, jak ten
Mapper.FindTypeMapFor
, przestanie działać, stąd użycieexpression.TypeMap
pola.źródło
expression.TypeMap
nie jest już dostępny. Oto moje rozwiązanie dla 5.0public static IMappingExpression<TSource, TDestination> IgnoreAllNonExisting<TSource, TDestination>(this IMappingExpression<TSource, TDestination> expression)
aby naprawić problemy z typem.W przypadku programu Automapper 5.0, aby pominąć wszystkie niezapisane właściwości, wystarczy je umieścić
.ForAllOtherMembers (x => x.Ignore ());
na końcu swojego profilu.
Na przykład:
W takim przypadku tylko pole Id dla obiektu wyjściowego zostanie rozwiązane, wszystkie pozostałe zostaną pominięte. Działa jak urok, wydaje się, że nie potrzebujemy już żadnych skomplikowanych rozszerzeń!
źródło
Zaktualizowałem odpowiedź Roberta Schroedera na AutoMapper 4.2. Przy niestatycznych konfiguracjach mapowania nie możemy użyć
Mapper.GetAllTypeMaps()
, aleexpression
zawiera odniesienie do wymaganychTypeMap
:źródło
Jak wolisz określić, że niektórzy członkowie będą ignorowani? Czy istnieje konwencja, klasa podstawowa lub atrybut, który chcesz zastosować? Gdy przejdziesz do firmy polegającej na jawnym określaniu wszystkich mapowań, nie jestem pewien, jaką wartość uzyskasz z AutoMappera.
źródło
To wydaje się stare pytanie, ale pomyślałem, że opublikuję odpowiedź dla każdego, kto wygląda tak jak ja.
Używam ConstructUsing, inicjator obiektów w połączeniu z ForAllMembers ignoruje np
źródło
Jedyną informacją o ignorowaniu wielu członków jest ten wątek - http://groups.google.com/group/automapper-users/browse_thread/thread/9928ce9f2ffa641f . Myślę, że można użyć sztuczki zastosowanej w ProvidingCommonBaseClassConfiguration, aby zignorować wspólne właściwości podobnych klas.
I nie ma żadnych informacji na temat funkcji „Ignoruj resztę”. Przeglądałem już kod i wydaje mi się, że bardzo trudno będzie dodać taką funkcjonalność. Możesz także spróbować użyć jakiegoś atrybutu i oznaczyć go ignorowanymi właściwościami oraz dodać jakiś ogólny / wspólny kod, aby zignorować wszystkie oznaczone właściwości.
źródło
Wiem, że to stare pytanie, ale @jmoerdyk w twoim pytaniu:
możesz użyć tej odpowiedzi w ten sposób w profilu ctor
źródło
Możesz użyć ForAllMembers, aby zastąpić tylko potrzebne w ten sposób
Bądź ostrożny, zignoruje wszystko, a jeśli nie dodasz niestandardowego mapowania, są one już ignorowane i nie będą działać
również chcę powiedzieć, jeśli masz test jednostkowy dla AutoMapper. I testujesz, że wszystkie modele z poprawnie odwzorowanymi wszystkimi właściwościami nie powinny używać takiej metody rozszerzenia
powinieneś wyraźnie napisać ignoruj
źródło
Obecne (wersja 9) rozwiązanie do ignorowania właściwości, które nie istnieją w typie docelowym, polega na utworzeniu odwróconego mapowania i odwróceniu go:
źródło
W wersji 3.3.1 możesz po prostu używać
IgnoreAllPropertiesWithAnInaccessibleSetter()
lubIgnoreAllSourcePropertiesWithAnInaccessibleSetter()
metod.źródło