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
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
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; } } 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; } } 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; } } BookStoreDto Fields in BookStore Name Name Books Books Address Address Fields in AddressDto Fields in Address Country City City PostCode PostCode Fields in BookDto Fields in Book Title Title Description Description Language Language Price Price Pub lishDate PublishDate Paperback Paperback 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 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 Fields in BookDto Fields in Publisher Publisher Name
which contains the AddressDto corresponding to Address:
and BookDto corresponding to Book:
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
(2)AddressDto -> Address
(3) BookDto -> Book.
Some basic fields in BookDto can directly correspond to fields in Book.
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.
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:
Finally there is the Publisher field, which will correspond to an independent Publisher object.
That’s it. Our need is to convert data from this big Dto to another big Model.