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的所有配置都在Global.asax.cs文件的Application_Start方法中进行。
protected void Application_Start()
{
Mapper.CreateMap<ProductDAO, ProductDTO>();
}
上述代码将根据以下约定设置对象之间的映射:
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类是实际执行工作的地方。