AutoMapper的高级使用:自定义格式化器

AutoMapper是一个.NET对象-对象映射库,它通过约定优于配置的原则,简化了数据转换的过程。本文将介绍如何使用AutoMapper进行对象映射,并展示如何通过自定义格式化器来增强映射功能。

对象映射简介

对象映射是将一种类型的对象转换为另一种类型的对象的过程。例如,将数据访问对象(DAO)转换为数据传输对象(DTO)。AutoMapper通过提供基于约定的映射方式,简化了这一转换过程。

在没有使用AutoMapper之前,映射代码可能如下所示:

public class ProductDAOtoProductDTOMapper { public ProductDTO Map(ProductDAO product) { return new ProductDTO { Name = product.Name, Description = product.Description, Price = product.Price, Quantity = product.Quantity }; } }

使用AutoMapper后,映射代码可以简化为:

var productDto = Mapper.Map<ProductDAO, ProductDTO>(productDao);

AutoMapper入门

AutoMapper的所有配置都在Global.asax.cs文件的Application_Start方法中进行。

protected void Application_Start() { Mapper.CreateMap<ProductDAO, ProductDTO>(); }

上述代码将根据以下约定设置对象之间的映射:

  • 匹配属性名称
  • 嵌套属性名称(例如,Product.Name映射到ProductName,假设遵循Pascal大小写命名约定)
  • 以Get开头的方法(例如,GetTotal()映射到Total)
  • 任何已配置的现有类型映射

自定义格式化器

AutoMapper提供了一个非常强大的功能——自定义格式化器。自定义格式化器可以在映射过程中介入,以任何想要的方式格式化正在映射的数据。

以下是一个将Model对象映射到ViewModel对象的示例,该对象将用于ASP.NETMVC应用程序的“视图”。Message属性包含网站访问者输入的评论,因此需要进行HTML编码。

Mapper.CreateMap<Comment, CommentViewModel>() .ForMember(c => c.Message, m => m.AddFormatter<HtmlEncodeFormatter>()); public class HtmlEncodeFormatter : IValueFormatter { public string FormatValue(ResolutionContext context) { return HttpContext.Current.Server.HtmlEncode(context.SourceValue.ToString()); } }

在上面的示例中,在创建Comment和CommentViewModel对象之间的映射时,特别指定了Message属性使用HtmlEncodeFormatter进行格式化。

也可以设置全局格式化器,这将在每次映射操作中应用。一个常见的场景是,可能希望以完全相同的格式显示所有日期。这非常容易设置:

// 设置全局格式化器 Mapper.AddFormatter<DateStringFormatter>(); // // 定义全局格式化器 public class DateStringFormatter : BaseFormatter<DateTime?> { protected override string FormatValueCore(DateTime? value) { return value.ToString("dddd, MMM dd, yyyy"); } } public abstract class BaseFormatter<T> : IValueFormatter { public string FormatValue(ResolutionContext context) { if (context.SourceValue == null) return null; if (!(context.SourceValue is T)) return context.SourceValue == null ? String.Empty : context.SourceValue.ToString(); return FormatValueCore((T)context.SourceValue); } protected abstract string FormatValueCore(T value); }

在上面的示例中,第一行代码实际上是注册全局格式化器的地方。DateStringFormatter和BaseFormatter类是实际执行工作的地方。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485