?
AutoMapper的基本使用請(qǐng)參考 : http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html
?
學(xué)習(xí)一下Nop是如何配置和集成AutoMapper的。
?
IStartupTask.cs
namespace Nop.Core.Infrastructure { public interface IStartupTask { void Execute(); int Order { get ; } } }
?
之前的隨便介紹了 ITypeFinder實(shí)現(xiàn) , 項(xiàng)目啟動(dòng)時(shí),ITypeFinder會(huì)找到項(xiàng)目中所有繼承 IStartupTask 接口的實(shí)現(xiàn)。其中就有AutoMapperStartupTask
using AutoMapper; using Nop.Admin.Models.Blogs; using Nop.Admin.Models.Catalog; using Nop.Admin.Models.Cms; using Nop.Admin.Models.Common; using Nop.Admin.Models.Customers; using Nop.Admin.Models.Directory; using Nop.Admin.Models.Discounts; using Nop.Admin.Models.ExternalAuthentication; using Nop.Admin.Models.Forums; using Nop.Admin.Models.Localization; using Nop.Admin.Models.Logging; using Nop.Admin.Models.Messages; using Nop.Admin.Models.News; using Nop.Admin.Models.Orders; using Nop.Admin.Models.Payments; using Nop.Admin.Models.Plugins; using Nop.Admin.Models.Polls; using Nop.Admin.Models.Settings; using Nop.Admin.Models.Shipping; using Nop.Admin.Models.Tax; using Nop.Admin.Models.Topics; using Nop.Core.Domain.Blogs; using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Common; using Nop.Core.Domain.Customers; using Nop.Core.Domain.Directory; using Nop.Core.Domain.Discounts; using Nop.Core.Domain.Forums; using Nop.Core.Domain.Localization; using Nop.Core.Domain.Logging; using Nop.Core.Domain.Media; using Nop.Core.Domain.Messages; using Nop.Core.Domain.News; using Nop.Core.Domain.Orders; using Nop.Core.Domain.Polls; using Nop.Core.Domain.Shipping; using Nop.Core.Domain.Tax; using Nop.Core.Domain.Topics; using Nop.Core.Infrastructure; using Nop.Core.Plugins; using Nop.Services.Authentication.External; using Nop.Services.Cms; using Nop.Services.Messages; using Nop.Services.Payments; using Nop.Services.Shipping; using Nop.Services.Tax; namespace Nop.Admin.Infrastructure { public class AutoMapperStartupTask : IStartupTask { public void Execute() { // TODO remove 'CreatedOnUtc' ignore mappings because now presentation layer models have 'CreatedOn' property and core entities have 'CreatedOnUtc' property (distinct names) // address Mapper.CreateMap<Address, AddressModel> () .ForMember(dest => dest.AddressHtml, mo => mo.Ignore()) .ForMember(dest => dest.AvailableCountries, mo => mo.Ignore()) .ForMember(dest => dest.AvailableStates, mo => mo.Ignore()) .ForMember(dest => dest.FirstNameDisabled, mo => mo.Ignore()) .ForMember(dest => dest.LastNameDisabled, mo => mo.Ignore()) .ForMember(dest => dest.EmailDisabled, mo => mo.Ignore()) .ForMember(dest => dest.CompanyDisabled, mo => mo.Ignore()) .ForMember(dest => dest.CountryDisabled, mo => mo.Ignore()) .ForMember(dest => dest.StateProvinceDisabled, mo => mo.Ignore()) .ForMember(dest => dest.CityDisabled, mo => mo.Ignore()) .ForMember(dest => dest.Address1Disabled, mo => mo.Ignore()) .ForMember(dest => dest.Address2Disabled, mo => mo.Ignore()) .ForMember(dest => dest.ZipPostalCodeDisabled, mo => mo.Ignore()) .ForMember(dest => dest.PhoneNumberDisabled, mo => mo.Ignore()) .ForMember(dest => dest.FaxNumberDisabled, mo => mo.Ignore()); Mapper.CreateMap <AddressModel, Address> () .ForMember(dest => dest.CreatedOnUtc, mo => mo.Ignore()) .ForMember(dest => dest.Country, mo => mo.Ignore()) .ForMember(dest => dest.StateProvince, mo => mo.Ignore());
……
}
?
然后是單元測(cè)試,AutoMapperStartupTask 提交后進(jìn)行集成測(cè)試,驗(yàn)證配置是否正確。
[TestFixture] public class AutoMapperConfigurationTest { [Test] public void Configuration_is_valid() { var autoMapperStartupTask = new AutoMapperStartupTask(); autoMapperStartupTask.Execute(); Mapper.AssertConfigurationIsValid(); } }
?
這里一個(gè)專門用于Mapper的擴(kuò)展方法。
public static class MappingExtensions { #region Category public static CategoryModel ToModel( this Category entity) { return Mapper.Map<Category, CategoryModel> (entity); } public static Category ToEntity( this CategoryModel model) { return Mapper.Map<CategoryModel, Category> (model); } public static Category ToEntity( this CategoryModel model, Category destination) { return Mapper.Map(model, destination); } 。。。
?
最后是調(diào)用完成ViewModel,Entity的轉(zhuǎn)換
var gridModel = new GridModel<CategoryModel> { Data = categories.Select(x => { var categoryModel = x.ToModel(); categoryModel.Breadcrumb = x.GetCategoryBreadCrumb(_categoryService); return categoryModel; }), Total = categories.TotalCount }; return new JsonResult { Data = gridModel };
?
總結(jié): 光學(xué)會(huì)如何使用一個(gè)工具還不行,還要學(xué)習(xí)它如何能和自己的項(xiàng)目進(jìn)行良好的集成。。使用不當(dāng)?shù)脑挿炊绊懖寮晚?xiàng)目的擴(kuò)展性,增加項(xiàng)目的復(fù)雜度。Nop的模塊劃分很清晰,方便了今后學(xué)習(xí)和改造。
?
參考:
http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
