• 【AutoMapper】实体类间自动实现映射关系,及其转换。


    官方项目下载:

    http://automapper.codeplex.com/

    博文

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

    图解:

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

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using Agathas.Storefront.Infrastructure.Helpers;
     6 using Agathas.Storefront.Model;
     7 using Agathas.Storefront.Model.Basket;
     8 using Agathas.Storefront.Model.Categories;
     9 using Agathas.Storefront.Model.Customers;
    10 using Agathas.Storefront.Model.Orders;
    11 using Agathas.Storefront.Model.Orders.States;
    12 using Agathas.Storefront.Model.Products;
    13 using Agathas.Storefront.Model.Shipping;
    14 using Agathas.Storefront.Services.ViewModels;
    15 using AutoMapper;
    16 
    17 namespace Agathas.Storefront.Services
    18 {
    19     public class AutoMapperBootStrapper
    20     {
    21         public static void ConfigureAutoMapper()
    22         {
    23             // Product Title
    24             Mapper.CreateMap<ProductTitle, ProductSummaryView>();
    25             Mapper.CreateMap<ProductTitle, ProductView>();
    26             Mapper.CreateMap<Product, ProductSummaryView>();
    27             Mapper.CreateMap<Product, ProductSizeOption>();
    28 
    29             // Category
    30             Mapper.CreateMap<Category, CategoryView>();
    31 
    32             // IProductAttribute
    33             Mapper.CreateMap<IProductAttribute, Refinement>();
    34 
    35             // Basket
    36             Mapper.CreateMap<DeliveryOption, DeliveryOptionView>();
    37             Mapper.CreateMap<BasketItem, BasketItemView>();
    38             Mapper.CreateMap<Basket, BasketView>();
    39 
    40             // Customer
    41             Mapper.CreateMap<Customer, CustomerView>();
    42             Mapper.CreateMap<DeliveryAddress, DeliveryAddressView>();
    43 
    44             // Orders
    45             Mapper.CreateMap<Order, OrderView>();
    46             Mapper.CreateMap<OrderItem, OrderItemView>();
    47             Mapper.CreateMap<Address, DeliveryAddressView>();
    48             Mapper.CreateMap<Order, OrderSummaryView>()
    49                 .ForMember(o => o.IsSubmitted,
    50                            ov => ov.ResolveUsing<OrderStatusResolver>());
    51 
    52 
    53             // Global Money Formatter
    54             Mapper.AddFormatter<MoneyFormatter>();
    55 
    56         }
    57     }
    58 
    59     public class OrderStatusResolver : ValueResolver<Order, bool>
    60     {
    61         protected override bool ResolveCore(Order source)
    62         {
    63             if (source.Status == OrderStatus.Submitted)
    64             {
    65                 return true;
    66             }
    67             else
    68             {
    69                 return false;
    70             }
    71         }
    72     }
    73 
    74 
    75     public class MoneyFormatter : IValueFormatter
    76     {
    77         public string FormatValue(ResolutionContext context)
    78         {
    79             if (context.SourceValue is decimal)
    80             {
    81                 decimal money = (decimal)context.SourceValue;
    82 
    83                 return money.FormatMoney();
    84             }
    85 
    86             return context.SourceValue.ToString();
    87         }
    88     }
    89 
    90 }

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

    Order.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using Agathas.Storefront.Infrastructure.Domain;
      6 using Agathas.Storefront.Model.Customers;
      7 using Agathas.Storefront.Model.Orders.States;
      8 using Agathas.Storefront.Model.Products;
      9 using Agathas.Storefront.Model.Shipping;
     10 
     11 namespace Agathas.Storefront.Model.Orders
     12 {
     13     public class Order : EntityBase<int>, IAggregateRoot
     14     {
     15         private IList<OrderItem> _items;
     16         private DateTime _created;
     17         private Payment _payment;
     18         private IOrderState _state;
     19 
     20         public Order()
     21         {
     22             _created = DateTime.Now;
     23             _items = new List<OrderItem>();
     24             _state = OrderStates.Open;
     25         }
     26 
     27         public DateTime Created
     28         {
     29             get { return _created; }
     30         }
     31 
     32         public decimal ShippingCharge { get; set; }
     33 
     34         public ShippingService ShippingService { get; set; }
     35 
     36         public decimal ItemTotal()
     37         {
     38             return Items.Sum(i => i.LineTotal());
     39         }
     40 
     41         public decimal Total()
     42         {
     43             return Items.Sum(i => i.LineTotal()) + ShippingCharge;
     44         }
     45 
     46         public Payment Payment
     47         {
     48             get { return _payment; }
     49         }
     50 
     51         public void SetPayment(Payment payment)
     52         {
     53             if (OrderHasBeenPaidFor())
     54                 throw new OrderAlreadyPaidForException(
     55                                            GetDetailsOnExisitingPayment());
     56 
     57             if (OrderTotalMatches(payment))
     58                 _payment = payment;
     59             else
     60                 throw new PaymentAmountDoesNotEqualOrderTotalException(
     61                                              GetDetailsOnIssueWith(payment));
     62 
     63             _state.Submit(this);
     64         }
     65 
     66         private string GetDetailsOnExisitingPayment()
     67         {
     68             return String.Format("Order has already been paid for. " +
     69                                  "{0} was paid on {1}. Payment token '{2}'",
     70                                  Payment.Amount, Payment.DatePaid,
     71                                  Payment.TransactionId);
     72         }
     73 
     74         private string GetDetailsOnIssueWith(Payment payment)
     75         {
     76             return String.Format("Payment amount is invalid. " +
     77                                 "Order total is {0} but payment for {1}." +
     78                                 " Payment token '{2}'",
     79                                 this.Total(), payment.Amount, payment.TransactionId);
     80         }
     81 
     82         public bool OrderHasBeenPaidFor()
     83         {
     84             return Payment != null && OrderTotalMatches(Payment);
     85         }
     86 
     87         private bool OrderTotalMatches(Payment payment)
     88         {
     89             return Total() == payment.Amount;
     90         }
     91 
     92         public Customer Customer { get; set; }
     93 
     94         public Address DeliveryAddress { get; set; }
     95 
     96         public IEnumerable<OrderItem> Items
     97         {
     98             get { return _items; }
     99         }
    100 
    101         public OrderStatus Status
    102         {
    103             get { return _state.Status; }
    104         }
    105 
    106         public void AddItem(Product product, int qty)
    107         {
    108             if (_state.CanAddProduct())
    109             {
    110                 if (!OrderContains(product))
    111                     _items.Add(OrderItemFactory.CreateItemFor(product, this, qty));
    112             }
    113             else
    114                 throw new CannotAmendOrderException(String.Format(
    115                 "You cannot add an item to an order with the status of '{0}'.",
    116                                                                Status.ToString()));
    117         }
    118 
    119         private bool OrderContains(Product product)
    120         {
    121             return _items.Any(i => i.Contains(product));
    122         }
    123 
    124         protected override void Validate()
    125         {
    126             if (Created == DateTime.MinValue)
    127                 base.AddBrokenRule(OrderBusinessRules.CreatedDateRequired);
    128 
    129             if (Customer == null)
    130                 base.AddBrokenRule(OrderBusinessRules.CustomerRequired);
    131 
    132             if (DeliveryAddress == null)
    133                 base.AddBrokenRule(OrderBusinessRules.DeliveryAddressRequired);
    134 
    135             if (Items == null || Items.Count() == 0)
    136                 base.AddBrokenRule(OrderBusinessRules.ItemsRequired); 
    137             else
    138             {
    139                 if (Items.Any(i => i.GetBrokenRules().Count() > 0))
    140                 {
    141                     foreach (OrderItem item in Items.Where(i => i.GetBrokenRules().Count() > 0))
    142                     {
    143                         foreach (BusinessRule businessRule in item.GetBrokenRules())
    144                         {
    145                             base.AddBrokenRule(businessRule);
    146                         }
    147                     }
    148                 }
    149             } 
    150 
    151             if (ShippingService == null)
    152                 base.AddBrokenRule(OrderBusinessRules.ShippingServiceRequired);
    153 
    154         }
    155 
    156         internal void SetStateTo(IOrderState state)
    157         {
    158             this._state = state;
    159         }
    160 
    161         public override string ToString()
    162         {
    163             StringBuilder orderInfo = new StringBuilder();
    164 
    165             foreach (OrderItem item in _items)
    166             {
    167                 orderInfo.AppendLine(String.Format("{0} of {1} ",
    168                                     item.Qty, item.Product.Name));
    169             }
    170 
    171             orderInfo.AppendLine(String.Format("Shipping: {0}", this.ShippingCharge));
    172             orderInfo.AppendLine(String.Format("Total: {0}", this.Total()));
    173 
    174             return orderInfo.ToString();
    175 
    176         }
    177     }
    178 
    179 }
    View Code

    OrderSummaryView.cs

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace Agathas.Storefront.Services.ViewModels
     7 {
     8     public class OrderSummaryView
     9     {
    10         public int Id { get; set; }
    11         public DateTime Created { get; set; }
    12         public bool IsSubmitted { get; set; }
    13     }
    14 
    15 }
    View Code

    第二步:启用配置:

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

    第三步:使用:OrderMapper.cs

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using Agathas.Storefront.Model.Orders;
     6 using Agathas.Storefront.Services.ViewModels;
     7 using AutoMapper;
     8 
     9 namespace Agathas.Storefront.Services.Mapping
    10 {
    11     public static class OrderMapper
    12     {
    13         public static OrderView ConvertToOrderView(this Order order)
    14         {
    15             return Mapper.Map<Order, OrderView>(order);
    16         }
    17 
    18         public static IEnumerable<OrderSummaryView> ConvertToOrderSummaryViews(
    19                                                       this IEnumerable<Order> orders)
    20         {
    21             return Mapper.Map<IEnumerable<Order>, IEnumerable<OrderSummaryView>>(orders);
    22         }
    23     }
    24 
    25 }

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

    1 Order order = new 。。。;
    2 OrderView orderView = order.ConvertToOrderView();
    1 OrderSummaryViews orderSummaryViews = new .....;
    2 IEnumerable<OrderSummaryView> Orders = orderSummaryViews.ConvertToOrderSummaryViews()
  • 相关阅读:
    [ZT]The 10 best crossplatform applications
    [Today Words] 20090602
    [转] 各种豆浆的做法(搭配美图) 超赞!!不得不看哦~
    .NET Framework Tools
    格式化XML:输出有缩进效果的XML字符串
    The Open Source Definition
    【ZT】新东方10天背5500词汇经典讲座
    《代码大全2》阅读笔记16 Chapter 13 Unusual Data Types
    【ZT】C#语法之fixed 语句
    【MSDN】PDB 文件(C#、J# 和 Visual Basic)
  • 原文地址:https://www.cnblogs.com/easy5weikai/p/3715496.html
Copyright © 2020-2023  润新知