Jak zmapować JObject do konkretnej klasy za pomocą AutoMappera.

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.

notworking

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.

working

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!

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s