Siemanko
Wykorzystując generyczne możliwości C# oraz bibliotekę AutoMapper do mapowania modeli na podstawie konwencji, można zaimplementować np. operacje CRUDowe dla wielu modeli bez potrzeby powtarzania kodu konkretnej implementacji dla konkretnego modelu. Ostatnio, implementując coś w rodzaju kolejki eventów oraz ich obsługi, musiałem się na chwilę zatrzymać przy mapowaniu za pomocą AutoMappera zdeserializowanego (Newtonsoft.Json) obiektu do obiektu konkretnej klasy.
Zwykłe CreateMap<> nie działa.
Na początku stworzyłem najprostszy profil mapowania.
public class SomeClassProfile : Profile { public SomeClassProfile() { CreateMap<JObject, SomeClass>(); } }
To jednak nie zadziała i efektem mapowania będzie obiekt z default’owymi wartościami propert.
Pewnie się zastanawiasz czemu od razu nie deserializuje do konkretnej klasy – otóż w realnym problemie, który rozwiązywałem przy deserializacji jeszcze nie wiedziałem jakiego typu jest to obiekt.
Trochę poguglałem i okazało się, że trzeba swtorzyć niecio bardziej osobliwy mapping z wykorzystaniem JsonSerializer
public class SomeClassProfile : Profile { public SomeClassProfile() { CreateMap<JObject, SomeClass>().ConstructUsing((jObject) => { var someClassObject = new SomeClass(); var serializer = new JsonSerializer(); serializer.Populate(jObject.CreateReader(), someClassObject); return someClassObject; }); } }
Teraz wszystko bangla jak należy.
Wrzucam to tutaj głównie z myślą o sobie, abym w przyszłości mógł zrobić szybkiego copy-paste’a jeśli mi się zapomni, ale nie wykluczone, że przyda się to także i Tobie.
Pjona!