Jak pracować z AutoMapper w C #

AutoMapper to popularna biblioteka mapowania obiekt-obiekt, której można używać do mapowania obiektów należących do różnych typów. Na przykład może być konieczne zmapowanie obiektów DTO (Data Transfer Objects) w aplikacji na obiekty modelu. AutoMapper oszczędza żmudnego wysiłku związanego z koniecznością ręcznego mapowania jednej lub więcej właściwości takich niezgodnych typów.

Aby rozpocząć pracę z AutoMapper, należy utworzyć projekt w Visual Studio, a następnie zainstalować AutoMapper. Możesz zainstalować AutoMapper z NuGet za pomocą następującego polecenia w oknie konsoli Menedżera pakietów NuGet:

PM> Install-Package AutoMapper

Twórz mapowania za pomocą AutoMapper

Program odwzorowujący obiekt-obiekt, taki jak AutoMapper, konwertuje obiekt wejściowy jednego typu na obiekt wyjściowy innego typu. Rozważ następujące dwie klasy.

 klasa publiczna AuthorModel

    {

        public int Id

        {

            dostać; zestaw;

        }

        publiczny ciąg FirstName

        {

            przygotować się;

        }

        publiczny ciąg LastName

        {

            dostać; zestaw;

        }

        public string Address

        {

            dostać; zestaw;

        }

    }

 publiczna klasa AuthorDTO

    {

        public int Id

        {

            dostać; zestaw;

        }

        publiczny ciąg FirstName

        {

            dostać; zestaw;

        }

        publiczny ciąg LastName

        {

            dostać; zestaw;

        }

        public string Address

        {

            dostać; zestaw;

        }

    }

Poniższy fragment kodu pokazuje, jak można utworzyć mapę między tymi dwoma typami: AuthorModel i AuthorDTO.

var config = new MapperConfiguration (cfg => {

                cfg.CreateMap ();

            });

Następnie wykonanie mapowania między typami jest tak proste, jak pokazuje poniższy fragment kodu.

IMapper iMapper = config.CreateMapper ();

var source = nowy AuthorModel ();

var cel = iMapper.Map (źródło);

Przykład AutoMapper 

Popracujmy teraz z niektórymi danymi. Zapoznaj się z następującym fragmentem kodu, który przechowuje pewne dane w obiekcie źródłowym, a następnie wyświetla wartości właściwości w obiekcie docelowym po zakończeniu mapowania.

var config = new MapperConfiguration (cfg => {

                cfg.CreateMap ();

            });

IMapper iMapper = config.CreateMapper ();

var source = nowy AuthorModel ();

source.Id = 1;

source.FirstName = "Joydip";

source.LastName = "Kanjilal";

source.Address = "Indie";

var cel = iMapper.Map (źródło);

Console.WriteLine ("Nazwa autora:" + destination.FirstName + "" + destination.LastName);

Po wykonaniu powyższego fragmentu kodu zostanie wyświetlone nazwisko autora zapisane w obiekcie docelowym. Jednak wartości właściwości docelowego FirstName i docelowego LastName będą takie same jak obiektu źródłowego, ponieważ obiekty zostały pomyślnie zmapowane przy użyciu funkcji AutoMapper!

Zauważ, że AutoMapper może mapować dowolny zestaw klas. Jednak AutoMapper przestrzega pewnych konwencji, z których jedną jest to, że mapowane nazwy właściwości powinny mieć identyczne nazwy. Jeśli nazwy właściwości nie są identyczne, należy powiadomić AutoMapper o sposobie mapowania właściwości. Zakładając, że chcemy zmapować dwie właściwości Contact i ContactDetails, poniższy przykład ilustruje, jak można to osiągnąć.

var config = new MapperConfiguration (cfg => {

                cfg.CreateMap ()

                .ForMember (destination => destination.ContactDetails,

               opts => opts.MapFrom (source => source.Contact));

            });

Zwróć uwagę na następującą instrukcję, która jest używana do tworzenia obiektu docelowego.

var cel = iMapper.Map (źródło);

Jeśli obiekt docelowy już istnieje, możesz zamiast tego użyć poniższej instrukcji.

iMapper.Map (sourceObject, destinationObject);

Zasadniczo powyższy fragment kodu może zostać użyty do zmapowania dwóch obiektów, które już istnieją.

Korzystanie z rzutów w AutoMapper

AutoMapper zapewnia doskonałe wsparcie dla prognoz. Projekcje służą do odwzorowywania wartości źródłowych na miejsce docelowe, które nie pasuje do struktury źródła. (Z kolei mapowanie, które omówiliśmy powyżej, było mapowaniem jeden do jednego).

Spójrzmy teraz na projekcję. Na przykład rozważmy następującą klasę.

 Adres klasy publicznej

    {

        public string City {get; zestaw; }

        public string State {get; zestaw; }

        public string Country {get; zestaw; }

    }

Niech nasza klasa AuthorModel użyje klasy Address do przechowywania informacji adresowych autorów. Oto jak wyglądałaby zaktualizowana klasa AuthorModel.

 klasa publiczna AuthorModel

    {

        public int Id

        {

            dostać; zestaw;

        }

        publiczny ciąg FirstName

        {

            przygotować się;

        }

        publiczny ciąg LastName

        {

            dostać; zestaw;

        }

        adres publiczny

        {

            dostać; zestaw;

        }

    }

 A oto zaktualizowana klasa AuthorDTO.

publiczna klasa AuthorDTO

    {

        public int Id

        {

            dostać; zestaw;

        }

        publiczny ciąg FirstName

        {

            dostać; zestaw;

        }

        publiczny ciąg LastName

        {

            dostać; zestaw;

        }

        public string City {get; zestaw; }

        public string State {get; zestaw; }

        public string Country {get; zestaw; }

    }

Teraz przypuśćmy, że musimy zmapować klasy AuthorDTO i AuthorModel. Poniższy fragment kodu ilustruje, jak można to osiągnąć.

var config = new MapperConfiguration (cfg => {

                cfg.CreateMap ()

                   .ForMember (miejsce docelowe => adres.adresu,

              map => map.MapFrom (

                  source => nowy adres

                  {

                      Miasto = źródło .City,

                      Stan = źródło .Stan,

                      Country = source.Country

                  }));

Bardziej zaawansowane funkcje AutoMapper omówię w przyszłym poście tutaj. Do tego czasu możesz dowiedzieć się więcej o AutoMapper pod tym linkiem.

Jak zrobić więcej w C #:

  • Kiedy używać klasy abstrakcyjnej, a kiedy interfejsu w języku C #
  • Jak pracować z AutoMapper w C #
  • Jak używać wyrażeń lambda w C #
  • Jak pracować z delegatami Action, Func i Predicate w C #
  • Jak pracować z delegatami w C #
  • Jak zaimplementować prosty rejestrator w C #
  • Jak pracować z atrybutami w C #
  • Jak pracować z log4net w C #
  • Jak zaimplementować wzorzec projektu repozytorium w C #
  • Jak pracować z odbiciem w C #
  • Jak pracować z Filesystemwatcher w C #
  • Jak wykonać leniwą inicjalizację w C #
  • Jak pracować z MSMQ w C #
  • Jak pracować z metodami rozszerzającymi w C #
  • Jak nam wyrażenia lambda w C #
  • Kiedy używać słowa kluczowego volatile w języku C #
  • Jak używać słowa kluczowego yield w języku C #
  • Jak zaimplementować polimorfizm w C #
  • Jak zbudować własny harmonogram zadań w C #
  • Jak pracować z RabbitMQ w C #
  • Jak pracować z krotką w C #
  • Eksplorowanie metod wirtualnych i abstrakcyjnych w C #