Home  >  Article  >  Backend Development  >  Use AutoMapper to achieve free conversion between Dto and Model (Part 1)

Use AutoMapper to achieve free conversion between Dto and Model (Part 1)

巴扎黑
巴扎黑Original
2016-12-20 11:28:461582browse

In actual software development projects, our "business logic" often requires us to perform various transformations on the same data. For example, a web application collects user input through the front end into Dto, and then converts the Dto into a domain model and persists it in the database. On the other hand, when the user requests data, we need to do the opposite: convert the domain model queried from the database into Dto in the opposite way and then present it to the user. Sometimes we will also face more data usage requirements, such as multiple clients using data. Each client has its own different requirements for data structure, which also requires us to perform more data conversions.
Frequent data conversion is trivial and messy. Many times we have to:
(1) The two types are almost only different in name but have similar structures. However, data transfer between types can only be achieved manually and attribute by attribute. "transmission".
(2) Every time you encounter a new data conversion scenario, you must manually implement a set of conversion logic, resulting in repeated data conversion operations that are scattered to every corner of the application.
If there is such a "Transformers"-like tool that can turn "oranges" into the "apples" we want, all we need to do is define the conversion rules - do our real business logic, or even in simple In the scenario, there is no need to define rules (Convention Over Configuration), which would be a very beautiful thing. In fact, we don't have to reinvent the wheel in .NET because we have AutoMapper, a powerful Object-Object Mapping tool.
Okay, I admit that I am a little excited. In fact, the project I am working on is experiencing the above "confusion", and AutoMapper really brings me a bright feeling. Therefore, I spent a little weekend break to try out AutoMapper. I realized the mapping of Dto to domain model through small application scenarios, and I really felt its "powerful aura". I will share my experience in using it in the article, hoping to bring some help to you who are also confused. I will release the complete project code to my git repository later. Everyone is welcome to refer to it freely.
【1】Application Scenario Description
First, let’s take a look at our “virtual” domain model. This time I defined a bookstore (BookStore):

C# code

public class BookStore

{

public string Name { get; set; }

public List Books { get; set; }

Public Address Address {get; set;}

}


The bookstore has its own address (Address):

C# code

public class Address

{

public string Country { get; set; }

public string City { get; set; }

public string Street { get; set; }

public string PostCode { get; set; }

}


At the same time, there are n books (Books) in the bookstore:

C# code

public class Book

{

public string Title { get; set; }

public string Description { get; set; }

public string Language { get; set; }

public decimal Price { get; set; }

public List Authors { get; set; }

public DateTime? PublishDate { get; set; }

public Publisher Publisher { get; set; }

public int? Paperback { get; set; }

}


Each book has publisher information (Publisher):

C# code

public class Publisher

{

public string Name { get; set; }

}


Each book can have up to 2 author information (Author):

C# code

public class Author

{

public string Name { get; set; }

public string Description { get; set; }

public ContactInfo ContactInfo { get; set; }

}


Each author has his own contact information (ContactInfo):

C# code

public class ContactInfo

{

public string Email { get; set; }

public string Blog { get; set; }

public string Twitter { get; set; }

}


That’s pretty much it, one with levels Structural domain model.
Let’s take a look at our Dto structure again.
In Dto we have BookStoreDto corresponding to BookStore:

C# code

public class BookStoreDto

{

public string Name { get; set; }

public List

Public AddressDto Address { get; set; }

}


which contains the AddressDto corresponding to Address:

C# code

public class AddressDto

{

public string Country { get; set; }

public string City { get; set; }

public string Street { get; set; }

public string PostCode { get; set; }

}


and BookDto corresponding to Book:

C# Code

public class BookDto

{

public string Title { get; set; }

public string Description { get; set; }

public string Language { get; set ; }

public decimal Price { get; set; }

public DateTime? PublishDate { get; set; }

public string Publisher { get; set; }

public int? Paperback { get; set; }

public string FirstAuthorName { get; set; }

public string FirstAuthorDescription { get; set; }

public string FirstAuthorEmail { get; set; }

public string FirstAuthorBlog { get; set; }

public string FirstAuthorTwitter { get; set; }

public string SecondAuthorName { get ; set; }

public string SecondAuthorDescription { get; set; }

public string SecondAuthorEmail { get; set; }

public string SecondAuthorBlog { get; set; }

public string SecondAuthorTwitter { get; set; }

}


Notice that our BookDto "flattens" the hierarchical structure of the entire Book. A BookDto carries the data of the Book and all its Author, Publisher and other modes.
It’s time for us to take a look at the mapping rules from Dto to Model.
(1) BookStoreDto -> Fields in BookStore

BookStoreDto Fields in BookStore

Name Name

Books Books

Address Address


(2)AddressDto -> Address

Fields in AddressDto Fields in Address

Country

City

City

🎜Street 🎜

PostCode PostCode


(3) BookDto -> Book.
Some basic fields in BookDto can directly correspond to fields in Book.

Fields in BookDto Fields in Book

Title Title

Description Description

Language Language

Price Price

Pub lishDate PublishDate

Paperback Paperback


Each book has at most 2 authors, in BookDto They are represented by fields prefixed with "First" and "Second" respectively. Therefore, all FirstXXX fields will be mapped to the first Author object in Book's Authors, and all SecondXXX fields will be mapped to the second Author object in Authors.

Fields in BookDto Fields in the 1st Author object in Authors in Book

FirstAuthorName Name

FirstAuthorDescription Description

FirstAuthorEmail ContactInfo.Email

FirstAuthorBlog ContactInfo.Blog

FirstAuthorTwitter ContactInfo.Twitter


Note that ContactInfo.Email in the above table represents the Email field corresponding to the ContactInfo of the Author object, and so on. Similarly we have:

Fields in BookDto Fields in the second Author object in Authors in Book

SecondAuthorName Name

SecondAuthorDescription Description

SecondAuthorEmail ContactIn fo.Email

SecondAuthorBlog ContactInfo.Blog

SecondAuthorTwitter ContactInfo .Twitter


Finally there is the Publisher field, which will correspond to an independent Publisher object.

Fields in BookDto Fields in Publisher

Publisher Name


That’s it. Our need is to convert data from this big Dto to another big Model.


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:Type.GetType()Next article:Type.GetType()