【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 ...
随机推荐
- (转)[转]大数据时代的 9 大Key-Value存储数据库
在过去的十年中,计算世界已经改变.现在不仅在大公司,甚至一些小公司也积累了TB量级的数据.各种规模的组织开始有了处理大数据的需求,而目前关系型数据库在可缩放方面几乎已经达到极限. 一个解决方案是使用键 ...
- struts2值栈分析
前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易. struts2中利用值栈来存储数据, ...
- PCB常用度量衡单位
1英尺=12英寸 1英寸inch=1000密尔mil 1mil=25.4um 1mil=1000uin (mil密耳有时也成英丝) 1um=40uin(有些公司称微英寸为麦,其实是微英寸) 1OZ=2 ...
- ubuntu 14.04 下FTP服务器的搭建--锁定用户目录,解决vsftpd: refusing to run with writable root inside chroot()
FTP服务器的搭建,我要实现的需求是: 不允许匿名访问,因为我的机器不想让谁都能登录上来,随便获取文件, 需要锁定一个目录,因为在家里,我需要给媳妇下载一些电影 韩剧之类的东西,媳妇会来我机器下载,但 ...
- 【WinForm】线程中向listview添加数据
在使用listview的时候,因为处理的数据较多,为防止在处理数据时出现假死的状态出现卡的情况,我们使用委托进行处理添加数据 定义委托 private delegate void AddListVie ...
- Spring.Net的Ioc功能基本配置
Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入.面向方面编程(AOP).数据访问抽象及ASP.NET扩展等等. Spri ...
- Mysql多表查询(两张独立表,一张关系表)
一.数据库设计 1.三个数据表长这样 其中user表记录用户信息,cat主要记录男女性别,mete表是用户id和性别id的对应关系 2.具体数据如下 二.查询目标 查询出所有性别为“男”的 ...
- python学习第七天
一. subprocess 模块 1. subprocess的介绍:用来替代几个老的模块或是函数,如:os.systam,os.popen,os.spawn*,os.popen2*,co ...
- 基于 WebAPI 的 API 实现
本文基于 WebAPI OData (微软发起的一个格式标准,其中一个比较有意思的是可以直接在 Excel 中填入 API 就可以展示了) Swashbuckle.OData(把 API 生成一个测试 ...
- Oracle中的IF...THEN...ELSE判断
if...then...else是最常见的一种判断语句,他可以实现判断两种情况. 标准语法如下: if <condition_expression> then plsql_sentence ...