Recently I discovered a more interesting thing, AutoMapper, which mainly converts Model into DTO. DTO pays more attention to data and reasonably encapsulates domain objects, so as not to over-expose the behavior of domain objects to the presentation layer.
Let’s look at some examples first, the mapping between the two classes.
First define two classes, Source and DTOSource:
public class Source { public int Id { get; set; } public string Content { get; set; } } public class DTOSource { public int Id { get; set; } public string Content { get; set; } }
The Source and DTOSource fields are exactly the same. Let’s see how they are converted through AutoMapper. The code is very simple.
Mapper.Initialize(x=>{ x.CreateMap<Source,DTOSource>(); }); Source s = new Source{Id=1,Content="123"}; DTOSource dto = Mapper.Map<DTOSource>(s);
The first step is to establish the mapping between Source and DTOSource. After initializing a Source instance, look at the execution results:
After the execution is completed, You can see that the data in dto is the same as the data in s that was initialized before. It is like directly copying s to dto. This is true when the two class fields are named the same. Then if the data in DTOSource No matter how the field name is different from that in Source, it is actually very simple. You only need to change it to a little bit of code:
We will change the field name of Content in DTOSource to Desc, at this time you only need to specify the fields when establishing a mapping relationship:
1 Mapper.Initialize(x => { 2 x.CreateMap<Source, DTOSource>().ForMember(c=>c.Desc,q=> { 3 q.MapFrom(z => z.Content); 4 }); 5 });
Let’s see the running results;
You can see the The results from the previous run are the same.
So how to map two Lists is actually very simple. It is almost the same as the above code. It is just a little modification in the last step. As shown in the following code:
Mapper.Initialize(x => { x.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); }); s.Add(new Source { Id = 1, Content = "123" }); var dto = Mapper.Map<List<DTOSource>>(s);
You can see that except for the last sentence of code, the others are almost identical, except that in the last sentence of code, the target type is changed to List
The results are in line with expectations.
In actual projects, this way of writing definitely does not meet the requirements. Generally, an encapsulation is made, and a new SourceProfile is inherited from Profile:
1 public SourceProfile() 2 { 3 base.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { 4 q.MapFrom(z => z.Content); 5 }); 6 }
All mapping relationships can be written here In a class, it only needs to be called once during program initialization:
1 Mapper.Initialize(x =>{ x.AddProfile<SourceProfile>(); });
The AutoMapper version used by the blogger is 6.1.1.0. Because AutoMapper removed Configure in Profile in version 6.0, it is the same as The writing method for versions below 6.0 is a little different. The writing method for versions below 6.0 is:
public class SourceProfile : Profile { protected override void Configure() { CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); } }
Just inherit Profile and rewrite its Configure. The calling method is not much different from the above. One or more Profiles can be added to Mapper.Initialize.
In the application of MVC project, Mapper.Initialize can be encapsulated into a class;
public static class AutoMapperForMvc { public static void Register() { Mapper.Initialize(x => { x.AddProfile<SourceProfile>(); }); } }
Then register it once in Global of MVC:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); //注册 AutoMapperForMvc.Register(); } }
The above is the detailed content of Examples of AutoMapper applications in C#. For more information, please follow other related articles on the PHP Chinese website!