【AutoMapper】实体类间自动实现映射关系,及其转换。
官方项目下载:
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】实体类间自动实现映射关系,及其转换。的更多相关文章
- mybatis逆向工程自动生成实体类、接口以及映射Mapper.xml配置文件
Mybatis的逆向工程非常简单,只要一个配置文件和一个Main方法就可以实现,下面以maven工程为例: (1)在pom.xml中引入依赖包 <dependency> <group ...
- 通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件
通过数据库中的表,使用 MyEclipse2017的反向生成工具-->hibernate反转引擎引擎(MyEclipse2017自带的插件) 来反转生成实体类和对应的映射文件 文章目录 Ja ...
- C#实体类null自动转空字符串
C#实体类null自动转空字符串 using System.ComponentModel.DataAnnotations; [DisplayFormat(ConvertEmptyStringToNul ...
- EntityFramework 系列:实体类配置-根据依赖配置关系和关联
EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关键在于搞清实体类的依赖关系,按此方法配置,快速高效合理.为了方便理解,我们使用简化的实体A和B以及A.B ...
- Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联
EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关键在于搞清实体类的依赖关系,按此方法配置,快速高效合理.为了方便理解,我们使用简化的实体A和B以及A.B ...
- 【转】Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联
本文转自:http://www.cnblogs.com/easygame/p/3622893.html EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关 ...
- Hibernate用注解实现实体类和表的映射
数据库mysql: 1.一对一 person50表password50表是一对一的关系: password50表中有外键 person_id person实体类: package com.c50.en ...
- mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里
- Hibernate 由实体类与配置文件的配置关系生成数据库中的表
import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class ...
随机推荐
- 【学习笔记】【C语言】数组
1. 什么是数组 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的 2. 数组的特点 只能存放一种类型的数据,比如int类型的数组.float类型的数组 里面存放的数据称为“元素 ...
- fread 和 fwrite 函数用法示例以及注意事项
1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 3.说明 ( ...
- Codevs 1092 不高兴的津津
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参 ...
- HIV T2
甲学者将HIV病毒的遗传物质彻底水解后得到A.B.C三种化合物,乙学者将组成T2噬菌体的遗传物质彻底水解后得到了A.B.D三种化合物.你认为C.D两种化合物分别指的是 A.尿嘧啶.胸腺嘧啶 B.胸腺嘧 ...
- java大数--总结
BigInteger(高精度整数) 1.所在包: java.math.BigInteger 2.大数运算,以下返回类型均为BigInteger BigInteger a; BigInteger b; ...
- 【风马一族_Java】 Java的文件类 java.io
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Reader ...
- Object-C编译的Protobuf
因工作需要,要编译Object-C可用的Protocbuf,开始查资料, http://www.cnblogs.com/uniy/archive/2011/12/21/2296405.html 结果执 ...
- iTerm2 颜色配置
1. 首先找到配色文件: iterm2官网配色方案iTerm2-Color-Schemes altercation的 solarized配色方案solarized 2. 配置步骤: clone上面的 ...
- opencv学习笔记(04)——ROI
ROI的用法:1.直接相加:2.掩码法 #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgpro ...
- Java方法重载
Java允许一个类中定义多个方法,只要参数列表不同就行了.如果同一个类中包含了两个或者两个以上的方法的方法名相同,但形参列表不同,则被称为方法重载. /* 参数类型不同的重载 */ public cl ...