注:本系列文章的代码可以在
这里下载。
在上一篇文章中我们构造出了完整的应用场景,包括我们的Model、Dto以及它们之间的转换规则。下面就可以卷起袖子,开始我们的AutoMapper之旅了。
【二】以Convention方式实现零配置的对象映射
我们的AddressDto和Address结构完全一致,且字段名也完全相同。对于这样的类型转换,AutoMapper为我们提供了Convention,正如它的官网上所说的:
引用
AutoMapper uses a convention-based matching algorithm to match up source to destination values.
我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型):
Mapper.CreateMap<AddressDto, Address>();
然后就可以交给AutoMapper帮我们搞定一切了:
AddressDto dto = new AddressDto
{
Country = "China",
City = "Beijing",
Street = "Dongzhimen Street",
PostCode = "100001"
};
Address address = Mapper.Map<AddressDto,Address>(Dto);
address.Country.ShouldEqual("China");
address.City.ShouldEqual("Beijing");
address.Street.ShouldEqual("Dongzhimen Street");
address.PostCode.ShouldEqual("100001");
如果AddressDto中有值为空的属性,AutoMapper在映射的时候会把Address中的相应属性也置为空:
Address address = Mapper.Map<AddressDto,Address>(new AddressDto
{
Country = "China"
});
address.City.ShouldBeNull();
address.Street.ShouldBeNull();
address.PostCode.ShouldBeNull();
甚至如果传入一个空的AddressDto,AutoMapper也会帮我们得到一个空的Address对象。
Address address = Mapper.Map<AddressDto,Address>(null);
address.ShouldBeNull();
千万不要把这种Convention的映射方式当成“玩具”,它在映射具有相同字段名的复杂类型的时候还是具有相当大的威力的。
例如,考虑我们的BookStoreDto到BookStore的映射,两者的字段名称完全相同,只是字段的类型不一致。如果我们定义好了BookDto到Book的映射规则,再加上上述Convention方式的AddressDto到Address的映射,就可以用“零配置”实现BookStoreDto到BookStore的映射了:
IMappingExpression<BookDto, Book> expression = Mapper.CreateMap<BookDto,Book>();
// Define mapping rules from BookDto to Book here
Mapper.CreateMap<AddressDto, Address>();
Mapper.CreateMap<BookStoreDto, BookStore>();
然后我们就可以直接转换BookStoreDto了:
BookStoreDto dto = new BookStoreDto
{
Name = "My Store",
Address = new AddressDto
{
City = "Beijing"
},
Books = new List<BookDto>
{
new BookDto {Title = "RESTful Web Service"},
new BookDto {Title = "Ruby for Rails"},
}
};
BookStore bookStore = Mapper.Map<BookStoreDto,BookStore>(dto);
bookStore.Name.ShouldEqual("My Store");
bookStore.Address.City.ShouldEqual("Beijing");
bookStore.Books.Count.ShouldEqual(2);
bookStore.Books.First().Title.ShouldEqual("RESTful Web Service");
bookStore.Books.Last().Title.ShouldEqual("Ruby for Rails");
【三】定义类型间的简单映射规则
前面我们看了Convention的映射方式,客观的说还是有很多类型间的映射是无法通过简单的Convention方式来做的,这时候就需要我们使用Configuration了。好在我们的Configuration是在代码中以“强类型”的方式来写的,比写繁琐易错的xml方式是要好的多了。
先来看看BookDto到Publisher的映射。
回顾一下
前文中定义的规则:BookDto.Publisher -> Publisher.Name。
在AutoMapperzhong,我们可以这样映射:
var map = Mapper.CreateMap<BookDto,Publisher>();
map.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Publisher));
AutoMapper使用ForMember来指定每一个字段的映射规则:
引用
The each custom member configuration uses an action delegate to configure each member.
还好有强大的lambda表达式,规则的定义简单明了。
此外,我们还可以使用ConstructUsing的方式一次直接定义好所有字段的映射规则。例如我们要定义BookDto到第一作者(Author)的ContactInfo的映射,使用ConstructUsing方式,我们可以:
var map = Mapper.CreateMap<BookDto,ContactInfo>();
map.ConstructUsing(s => new ContactInfo
{
Blog = s.FirstAuthorBlog,
Email = s.FirstAuthorEmail,
Twitter = s.FirstAuthorTwitter
});
然后,就可以按照我们熟悉的方式来使用了:
BookDto dto = new BookDto
{
FirstAuthorEmail = "matt.rogen@abc.com",
FirstAuthorBlog = "matt.amazon.com",
};
ContactInfo contactInfo = Mapper.Map<BookDto, ContactInfo>(dto);
如果需要映射的2个类型有部分字段名称相同,又有部分字段名称不同呢?还好AutoMapper给我们提供的Convention或Configuration方式并不是“异或的”,我们可以结合使用两种方式,为名称不同的字段配置映射规则,而对于名称相同的字段则忽略配置。
例如对于前面提到的AddressDto到Address的映射,假如AddressDto的字段Country不叫Country叫CountryName,那么在写AddressDto到Address的映射规则时,只需要:
var map = Mapper.CreateMap<AddressDto, Address>();
map.ForMember(d => d.Country, opt => opt.MapFrom(s => s.CountryName));
对于City、Street和PostCode无需定义任何规则,AutoMapper仍然可以帮我们进行正确的映射。
分享到:
相关推荐
在本篇中,我们将深入探讨如何使用AutoMapper库在.NET应用程序中实现Data Transfer Objects (Dto)与业务模型之间的自由转换。AutoMapper是一个流行的开源库,它简化了对象之间的映射过程,大大减少了手动编写转换...
在实际项目中,我们经常需要将Dto对象转换为实体类,反之亦然,这时就引入了自动化映射工具——AutoMapper。 AutoMapper是一个强大的.NET库,它简化了对象到对象之间的映射过程。在没有AutoMapper的情况下,开发者...
6. **DTO(Data Transfer Objects)**:在ASP.NET MVC或Web API中,通常使用DTO作为控制器与视图或客户端之间的数据交换格式,AutoMapper可以帮助轻松实现业务对象与DTO之间的转换。 7. **性能优化**:通过缓存映射...
在.NET开发领域,Entity Framework(简称EF)是微软提供的一款强大的对象关系映射(ORM)框架,它允许开发者使用面向对象的...在实际项目中,这样的设计模式和实现方式对于构建可扩展且易于维护的软件架构至关重要。
在了解了 DTO 的概念后,我们可以使用 AutoMapper 实现 DTO 和领域模型之间的转换。AutoMapper 是一个轻量级的 Object-Object Mapping 工具,非常流行且国外的大牛们都使用它。 使用 AutoMapper 有多种方式,下面是...
2. **视图模型与领域模型的互换**:在 MVC 应用中,视图模型可能需要与数据库中的领域模型有所不同,AutoMapper 可以方便地实现两者之间的转换。 3. **ORM 映射**:与 Entity Framework 或 NHibernate 等 ORM 工具...
AutoMapper中也可以配置反向映射,使用ReverseMap()方法。在目标类型中属性没有全部映射完毕的情况下,建议手动配置。 在AutoMapper中,也可以设置条件映射,满足指定条件才允许映射。使用Condition方法可以实现...
安装完成后,我们可以在代码中使用`using AutoMapper;`来引入命名空间。 接下来是映射配置。AutoMapper的配置通常在应用程序启动时完成,这样可以确保在映射过程中有一份全局的映射规则。配置包括定义源和目标对象...
4. **类型转换**:在映射过程中,AutoMapper可以自动处理源类型和目标类型之间的转换,只要.NET Framework提供了相应的转换器。 5. **双向映射**:不仅可以从实体到合同,也可以从合同到实体,只需定义一次映射规则...
3. **执行映射**:在实际业务逻辑中,当需要进行对象间的数据转换时,调用`Map()`方法,传入源对象和目标对象的实例,`AutoMapper`会根据之前定义的映射配置自动进行数据复制。 例如,假设我们有一个`UserEntity`...
在`Get`方法中,我们创建了一个`SourceClass`实例,并使用AutoMapper将其转换为`DestinationClass`。 总结一下,ASP.NET 6集成AutoMapper的主要步骤包括:安装AutoMapper相关包,定义映射规则,注册配置,以及在...
在这个“EF6 Fluent API+AutoMapper.EF6使用”的主题中,我们将深入探讨如何利用Fluent API对EF进行更细粒度的配置,并结合AutoMapper.EF6进行对象到对象的映射。 Fluent API是EF提供的一种用于替代数据注解的配置...
在这个例子中,`ProjectTo`方法将数据库中的`User`实体转换为DTO(数据传输对象),同时应用了之前定义的映射规则和动态条件。 5. **优化映射性能**:在处理大量数据时,应考虑使用`BatchMapper.Map`或`ProjectTo`...
`AutoMapper.Extensions.Microsoft.DependencyInjection` 表明了该库已经扩展到了微软的依赖注入(Dependency Injection,简称 DI)框架,使得在 ASP.NET Core 或其他支持 .NET Core 的项目中更方便地配置和使用 ...
标题中的“automapper+autofac+mvc5+三层-ioc”揭示了这个项目或教程是关于使用四个关键技术和框架来构建一个三层架构的MVC应用程序。这些技术包括: 1. AutoMapper:AutoMapper 是一个对象对象映射库,用于.NET...
在本文中,我们将通过一个实例来介绍Automapper如何实现自动映射。 首先,让我们了解一下为什么需要自动映射。在后台与前台进行数据传输时,我们往往不会直接传输实体模型,而是使用Dto(Data transfer object 数据...
3. **提高效率**:相比于多次调用服务端接口获取数据,使用DTO可以在一次调用中获取所有必要的数据,从而减少了网络通信的次数和开销。 4. **确保一致性**:使用DTO可以确保数据的一致性和完整性,在多层架构中尤其...
SqlSugarCore是一款高效、轻量级的.NET Core数据库操作库,它提供了丰富的ORM(对象关系映射)功能,...在实际项目中,根据具体需求和场景,合理地使用和配置这两个工具,将有助于打造高效且易于维护的数据库解决方案。