?
AutoMapper的基本使用請參考 : http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html
?
學習一下Nop是如何配置和集成AutoMapper的。
?
IStartupTask.cs
namespace Nop.Core.Infrastructure { public interface IStartupTask { void Execute(); int Order { get ; } } }
?
之前的隨便介紹了 ITypeFinder實現 , 項目啟動時,ITypeFinder會找到項目中所有繼承 IStartupTask 接口的實現。其中就有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());
……
}
?
然后是單元測試,AutoMapperStartupTask 提交后進行集成測試,驗證配置是否正確。
[TestFixture] public class AutoMapperConfigurationTest { [Test] public void Configuration_is_valid() { var autoMapperStartupTask = new AutoMapperStartupTask(); autoMapperStartupTask.Execute(); Mapper.AssertConfigurationIsValid(); } }
?
這里一個專門用于Mapper的擴展方法。
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); } 。。。
?
最后是調用完成ViewModel,Entity的轉換
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 };
?
總結: 光學會如何使用一個工具還不行,還要學習它如何能和自己的項目進行良好的集成。。使用不當的話反而影響插件和項目的擴展性,增加項目的復雜度。Nop的模塊劃分很清晰,方便了今后學習和改造。
?
參考:
http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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