AutoMapper对象映射工具简化了实体赋值的过程

  AutoMapper是一个.NET的对象映射工具,一般地,我们进行面向服务的开发时,都会涉及到DTO的概念,即数据传输对象,而为了减少系统的负载,一般我们不会把整个表的字段作为传输的数据,而是单独根据具体场景,写一个新的类,这个类一般以DTO结尾,意思是说,它是网络上的数据传输用的,而你的DTO数据对象的赋值过程就成了一个问题,而为了减少赋值过程的代码量,AutoMapper就出来了,它可以实现实体对实体的赋值过程,或者叫“映射过程”。

  我心中的项目应该是这样的,用户业务服务,产品业务服务,订单业务服务,这样服务都使 用单独的数据库,它们之间的通讯采用WCF进行实现,在获数据时会在WEB端添加缓存机制,以减少对WCF的调用,而在WCF的网络通讯中,数据类型一般 不会使用poco实体,因为它会有很多对当前业务无用的字段,我们会为具体业务建立具体的DTO对象,而entity实体与DTO实体之间的赋值过程我们 可以用AutoMapper来实现。

  AutoMapper在程序中的体现:

  DTO实体

[DataContract]
public class ProductDTO
{
    [DataMember]
    public int ProductID { get; set; }
    [DataMember]
    public string ProductName { get; set; }
    [DataMember]
    public DateTime CreateDate { get; set; }
    [DataMember]
    public int SaleCount { get; set; }
    [DataMember]
    public Nullable<int> ClickCount { get; set; }
    [DataMember]
    public string Info { get; set; }
    [DataMember]
    public int UserID { get; set; }
    [DataMember]
    public decimal SalePrice { get; set; }
    [DataMember]
    public int Discount { get; set; }
}

  POCO实体:

public partial class Product
{
    public Product()
    {
        this.ProductDetail = new HashSet<ProductDetail>();
    }
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public DateTime CreateDate { get; set; }
    public int SaleCount { get; set; }
    public Nullable<int> ClickCount { get; set; }
    public string Info { get; set; }
    public int UserID { get; set; }
    public decimal SalePrice { get; set; }
    public int Discount { get; set; }
    public DateTime UpdateDate { get; set; }

    public virtual User_Info User_Info { get; set; }
    public virtual ICollection<ProductDetail> ProductDetail { get; set; }
}

  下面使用AutoMapper实现对象两个实体的赋值,这是WCF服务中的代码片断:

public class ProductService : ServiceBase, IProductService
{

    //通过ServiceLocator从IoC容器中获得对象
    IProductRepository productRepository = ServiceLocator.Instance.GetService<IProductRepository>();

    #region IProductService 成员

    public ProductDTO CreateProduct(ProductDTO productDTO)
    {
        Mapper.CreateMap<ProductDTO, Product>();
        Product product = Mapper.Map<ProductDTO, Product>(productDTO);
        productRepository.AddProduct(product);
        return productDTO;
    }

    public List<ProductDTO> GetProduct()
    {
        Mapper.CreateMap<Product, ProductDTO>();
        List<ProductDTO> arr = new List<ProductDTO>();
        productRepository.GetProduct().ForEach(i =>
        {
            arr.Add(Mapper.Map<Product, ProductDTO>(i));
        });
        return arr;
    }

    public ProductDTO ModifyProduct(ProductDTO productDTO)
    {
        Mapper.CreateMap<ProductDTO , Product>();
        Product product = Mapper.Map<ProductDTO , Product>(productDTO);
        productRepository.ModifyProduct(product);
        return productDTO;
    }

    #endregion
}

  对AutoMapper实体映射的扩展

  扩展方法效果如下:

  实体对实体的映射(赋值)

var user = new User
{
   ID = 1,
   Name = "zzl",
   CreateDate = DateTime.Now,
};
UserModel model = user.MapTo<UserModel>();
Console.WriteLine(model.ID + model.Name);

  集合对集合的映射(赋值)

var userList = new List<User> { user };
userList.Add(new User
{
    ID = 2,
    Name = "zzllr",
    CreateDate = DateTime.Now,
});
var modelList = userList.MapTo<UserModel>();
modelList.ForEach(i =>
{
    Console.WriteLine(i.Name);
});

  下面是扩展方法的代码,一个是实体的,一个是集合的

// AutoMapper扩展方法
public static class AutoMapperExtension
{
    // 集合对集合
    public static List<TResult> MapTo<TResult>(this IEnumerable self)
    {
        if (self == null) throw new ArgumentNullException();
        Mapper.CreateMap(self.AsQueryable().ElementType, typeof(TResult));
        return (List<TResult>)Mapper.Map(self, self.GetType(), typeof(List<TResult>));
    }

    // 对象对对象
    public static TResult MapTo<TResult>(this object self)
    {
        if (self == null) throw new ArgumentNullException();
        Mapper.CreateMap(self.GetType(), typeof(TResult));
        return (TResult)Mapper.Map(self, self.GetType(), typeof(TResult));
    }
}

吐槽几句

  "(必填)"

  "(选填)"

  "(必填,不公开)"

(必填,最多100个字符。)(大家的评论

先说这么多吧