官方项目下载:

http://automapper.codeplex.com/

博文

http://www.iteye.com/blogs/tag/AutoMapper

图解:

第一步:创建映射Map:AutoMapperBootStrapper.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Agathas.Storefront.Infrastructure.Helpers;
using Agathas.Storefront.Model;
using Agathas.Storefront.Model.Basket;
using Agathas.Storefront.Model.Categories;
using Agathas.Storefront.Model.Customers;
using Agathas.Storefront.Model.Orders;
using Agathas.Storefront.Model.Orders.States;
using Agathas.Storefront.Model.Products;
using Agathas.Storefront.Model.Shipping;
using Agathas.Storefront.Services.ViewModels;
using AutoMapper; namespace Agathas.Storefront.Services
{
public class AutoMapperBootStrapper
{
public static void ConfigureAutoMapper()
{
// Product Title
Mapper.CreateMap<ProductTitle, ProductSummaryView>();
Mapper.CreateMap<ProductTitle, ProductView>();
Mapper.CreateMap<Product, ProductSummaryView>();
Mapper.CreateMap<Product, ProductSizeOption>(); // Category
Mapper.CreateMap<Category, CategoryView>(); // IProductAttribute
Mapper.CreateMap<IProductAttribute, Refinement>(); // Basket
Mapper.CreateMap<DeliveryOption, DeliveryOptionView>();
Mapper.CreateMap<BasketItem, BasketItemView>();
Mapper.CreateMap<Basket, BasketView>(); // Customer
Mapper.CreateMap<Customer, CustomerView>();
Mapper.CreateMap<DeliveryAddress, DeliveryAddressView>(); // Orders
Mapper.CreateMap<Order, OrderView>();
Mapper.CreateMap<OrderItem, OrderItemView>();
Mapper.CreateMap<Address, DeliveryAddressView>();
Mapper.CreateMap<Order, OrderSummaryView>()
.ForMember(o => o.IsSubmitted,
ov => ov.ResolveUsing<OrderStatusResolver>()); // Global Money Formatter
Mapper.AddFormatter<MoneyFormatter>(); }
} public class OrderStatusResolver : ValueResolver<Order, bool>
{
protected override bool ResolveCore(Order source)
{
if (source.Status == OrderStatus.Submitted)
{
return true;
}
else
{
return false;
}
}
} public class MoneyFormatter : IValueFormatter
{
public string FormatValue(ResolutionContext context)
{
if (context.SourceValue is decimal)
{
decimal money = (decimal)context.SourceValue; return money.FormatMoney();
} return context.SourceValue.ToString();
}
} }

这里是两个要创建映射的实体类

Order.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Agathas.Storefront.Infrastructure.Domain;
using Agathas.Storefront.Model.Customers;
using Agathas.Storefront.Model.Orders.States;
using Agathas.Storefront.Model.Products;
using Agathas.Storefront.Model.Shipping; namespace Agathas.Storefront.Model.Orders
{
public class Order : EntityBase<int>, IAggregateRoot
{
private IList<OrderItem> _items;
private DateTime _created;
private Payment _payment;
private IOrderState _state; public Order()
{
_created = DateTime.Now;
_items = new List<OrderItem>();
_state = OrderStates.Open;
} public DateTime Created
{
get { return _created; }
} public decimal ShippingCharge { get; set; } public ShippingService ShippingService { get; set; } public decimal ItemTotal()
{
return Items.Sum(i => i.LineTotal());
} public decimal Total()
{
return Items.Sum(i => i.LineTotal()) + ShippingCharge;
} public Payment Payment
{
get { return _payment; }
} public void SetPayment(Payment payment)
{
if (OrderHasBeenPaidFor())
throw new OrderAlreadyPaidForException(
GetDetailsOnExisitingPayment()); if (OrderTotalMatches(payment))
_payment = payment;
else
throw new PaymentAmountDoesNotEqualOrderTotalException(
GetDetailsOnIssueWith(payment)); _state.Submit(this);
} private string GetDetailsOnExisitingPayment()
{
return String.Format("Order has already been paid for. " +
"{0} was paid on {1}. Payment token '{2}'",
Payment.Amount, Payment.DatePaid,
Payment.TransactionId);
} private string GetDetailsOnIssueWith(Payment payment)
{
return String.Format("Payment amount is invalid. " +
"Order total is {0} but payment for {1}." +
" Payment token '{2}'",
this.Total(), payment.Amount, payment.TransactionId);
} public bool OrderHasBeenPaidFor()
{
return Payment != null && OrderTotalMatches(Payment);
} private bool OrderTotalMatches(Payment payment)
{
return Total() == payment.Amount;
} public Customer Customer { get; set; } public Address DeliveryAddress { get; set; } public IEnumerable<OrderItem> Items
{
get { return _items; }
} public OrderStatus Status
{
get { return _state.Status; }
} public void AddItem(Product product, int qty)
{
if (_state.CanAddProduct())
{
if (!OrderContains(product))
_items.Add(OrderItemFactory.CreateItemFor(product, this, qty));
}
else
throw new CannotAmendOrderException(String.Format(
"You cannot add an item to an order with the status of '{0}'.",
Status.ToString()));
} private bool OrderContains(Product product)
{
return _items.Any(i => i.Contains(product));
} protected override void Validate()
{
if (Created == DateTime.MinValue)
base.AddBrokenRule(OrderBusinessRules.CreatedDateRequired); if (Customer == null)
base.AddBrokenRule(OrderBusinessRules.CustomerRequired); if (DeliveryAddress == null)
base.AddBrokenRule(OrderBusinessRules.DeliveryAddressRequired); if (Items == null || Items.Count() == )
base.AddBrokenRule(OrderBusinessRules.ItemsRequired);
else
{
if (Items.Any(i => i.GetBrokenRules().Count() > ))
{
foreach (OrderItem item in Items.Where(i => i.GetBrokenRules().Count() > ))
{
foreach (BusinessRule businessRule in item.GetBrokenRules())
{
base.AddBrokenRule(businessRule);
}
}
}
} if (ShippingService == null)
base.AddBrokenRule(OrderBusinessRules.ShippingServiceRequired); } internal void SetStateTo(IOrderState state)
{
this._state = state;
} public override string ToString()
{
StringBuilder orderInfo = new StringBuilder(); foreach (OrderItem item in _items)
{
orderInfo.AppendLine(String.Format("{0} of {1} ",
item.Qty, item.Product.Name));
} orderInfo.AppendLine(String.Format("Shipping: {0}", this.ShippingCharge));
orderInfo.AppendLine(String.Format("Total: {0}", this.Total())); return orderInfo.ToString(); }
} }

OrderSummaryView.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Agathas.Storefront.Services.ViewModels
{
public class OrderSummaryView
{
public int Id { get; set; }
public DateTime Created { get; set; }
public bool IsSubmitted { get; set; }
} }

第二步:启用配置:

        protected void Application_Start()
{ Services.AutoMapperBootStrapper.ConfigureAutoMapper();

第三步:使用:OrderMapper.cs

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Agathas.Storefront.Model.Orders;
using Agathas.Storefront.Services.ViewModels;
using AutoMapper; namespace Agathas.Storefront.Services.Mapping
{
public static class OrderMapper
{
public static OrderView ConvertToOrderView(this Order order)
{
return Mapper.Map<Order, OrderView>(order);
} public static IEnumerable<OrderSummaryView> ConvertToOrderSummaryViews(
this IEnumerable<Order> orders)
{
return Mapper.Map<IEnumerable<Order>, IEnumerable<OrderSummaryView>>(orders);
}
} }

在需要两个类型转换的地方调用:

 Order order = new 。。。;
OrderView orderView = order.ConvertToOrderView();
 OrderSummaryViews orderSummaryViews = new .....;
IEnumerable<OrderSummaryView> Orders = orderSummaryViews.ConvertToOrderSummaryViews()

【AutoMapper】实体类间自动实现映射关系,及其转换。的更多相关文章

  1. mybatis逆向工程自动生成实体类、接口以及映射Mapper.xml配置文件

    Mybatis的逆向工程非常简单,只要一个配置文件和一个Main方法就可以实现,下面以maven工程为例: (1)在pom.xml中引入依赖包 <dependency> <group ...

  2. 通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件

    通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件   文章目录 Ja ...

  3. C#实体类null自动转空字符串

    C#实体类null自动转空字符串 using System.ComponentModel.DataAnnotations; [DisplayFormat(ConvertEmptyStringToNul ...

  4. EntityFramework 系列:实体类配置-根据依赖配置关系和关联

    EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关键在于搞清实体类的依赖关系,按此方法配置,快速高效合理.为了方便理解,我们使用简化的实体A和B以及A.B ...

  5. Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联

    EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关键在于搞清实体类的依赖关系,按此方法配置,快速高效合理.为了方便理解,我们使用简化的实体A和B以及A.B ...

  6. 【转】Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联

    本文转自:http://www.cnblogs.com/easygame/p/3622893.html EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关 ...

  7. Hibernate用注解实现实体类和表的映射

    数据库mysql: 1.一对一 person50表password50表是一对一的关系: password50表中有外键 person_id person实体类: package com.c50.en ...

  8. mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口

    搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里

  9. Hibernate 由实体类与配置文件的配置关系生成数据库中的表

    import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ...

随机推荐

  1. 前台JSP页面独立化

    一直从事Java WEB开发的过程中,当然要常常写JSP文件. 本人对JSP文件有些自己的想法. 页面要尽可能的简单,整洁,条理. js文件要尽可能地放到独立的js文件中,然后引用到当前的JSP文件中 ...

  2. 关联表映射 Association Table Mapping

    把关联保存为一个表,存储关联表的外键 在对象中,使用集合作为域值,来处理多值域. 而在DB中,只能有单值域. 外键映射的核心,是在关联关系的单值端使用外键来维持联系. 而在多对多的关联关系中,已经不存 ...

  3. COM包装(COM Wrappers)

    为了实现传统的COM程序与.NET程序之间的相互调用,.NET提供了两个包装类:运行时可调用包装(runtime callable wrapper,RCW)和COM可调用包装(COM callable ...

  4. 【转】Javascript 中的false,零值,null,undefined和空字符串对象

    js 开发中经常会碰到判断是否为空的情况,关于 null 和 undefined 的区别了解的不是很好,刚好看见这篇文章,转过来学习一下,以下是转载正文: 在Javascript中,我们经常会接触到题 ...

  5. Codevs 1081 线段树练习2

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master   题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第 ...

  6. DropDownList另一种写法

    2013-09-29 17:04:47 1.性别: <asp:DropDownList ID="DrpSex" runat ="server"  Widt ...

  7. STL--vector(转载)

    函数 表述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的 ...

  8. 一步一步学习C++

    根据<C++ primer>第五版 总结学习心得. 在实践中,不必全面地使用C++语言的各种特性,而应根据工程的实际情况,适当取舍(譬如动态类型信息,虚拟继承.异常等特性的使用,很值得商榷 ...

  9. Excel 窗体控件属性

    常规 AutoLoad   (Excel) 打开工作簿时是否加载控件.(如果是 ActiveX   控件,则忽略.) Enabled(表单) 控件是否可以接收焦点并响应用户生成的事件. Locked( ...

  10. Repost: Set Delivery Block on SO

    If SO is incomplete, then automatically set the delivery block on the SO header. as suggested by ear ...