前言
Hi,大家好,我是Rector
時間飛逝,一個星期又過去了,今天還是星期五,Rector在圖享網繼續跟大家分享系列文本:一步一步創建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]
上一篇《一步一步創建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)》,我們完成了:
- 創建服務層:TsBlog.Services
- 創建服務接口
- 實現服務接口
- 創建倉儲接口
- 安裝Autofac依賴注入組件
- 注冊配置Autofac 依賴注入
其中,最主要的是在項目中引入依賴注入組件:Autofac并配置及簡單的使用。本文我們將繼續本系列教程。
本文知識要點
- AutoMapper是什么簡述
- 安裝AutoMapper
- AutoMapper的配置
- AutoMapper的應用
AutoMapper 簡述

什么是AutoMapper?
簡單來說,AutoMapper是以.NET(C#)語言開發的一個輕量的處理一個實體對象到另一個實體對象之間映射關系的組件庫。開發人員需要作的事則是通過AutoMapper配置兩個實體對象之間的一些映射關系。
為什么使用AutoMapper?
映射代碼是無聊的。測試映射代碼更無聊。AutoMapper提供了一些簡單配置,還有一些簡單的映射測試。真正的問題可能是“為什么使用對象-對象的映射呢”?映射可能發生在一個應用的許多地方,但大多數情況下都發生在層與層之間的邊界,比如UI/Domain層之間,或者Service/Domain層之間。關注一層通常和關注另一層發生沖突,因此對象-對象間的映射來隔離模型model,這樣就只會影響每一層關注的類型。
安裝AutoMapper
安裝AutoMapper非常簡單,我們可以通過Nuget命令:
PM> Install-Package AutoMapper
直接安裝到對應的項目中,但在本系列的項目中,我們會專門創建一個關于AutoMapper的項目來配置AutoMapper的實體對象映射。所以,打開TsBlog解決方案,右鍵單擊解決方案目錄【1.Libraries】,添加一個新的.Net Framework項目,如下圖:

選中剛才創建的項目[TsBlog.AutoMapperConfig],打開程序包管理控制臺,選中默認項目為[1.Libraries\TsBlog.AutoMapperConfig],輸入Nuget包安裝命令,如下:

按Enter(回車)進行安裝,本文寫作時的AutoMapper版本是AutoMapper.6.2.2。
AutoMapper的配置
為了解決方案的目錄結構更加清晰,我這里把視圖實體放到了一個單獨的項目中。所以,再在解決方案目錄[1.Libraries]下創建一個名為[TsBlog.ViewModel]的項目,這個項目只存放關于視圖實體的類文件。
為了本文的演示,在TsBlog.ViewModel項目中創建Post文件夾,再創建一個PostViewModel.cs的視圖類,此時的解決方案目錄為:

PostViewModel.cs :
namespace TsBlog.ViewModel.Post
{
/// <summary>
/// 博文視圖實體類
/// </summary>
public class PostViewModel
{
/// <summary>
/// ID
/// </summary>
public int Id { get; set; }
/// <summary>
/// 標題
/// </summary>
public string Title { get; set; }
/// <summary>
/// 內容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 作者ID
/// </summary>
public string AuthorId { get; set; }
/// <summary>
/// 作者姓名
/// </summary>
public string AuthorName { get; set; }
/// <summary>
/// 創建時間
/// </summary>
public string CreatedAt { get; set; }
/// <summary>
/// 發布時間
/// </summary>
public string PublishedAt { get; set; }
/// <summary>
/// 是否標識已刪除
/// </summary>
public string IsDeleted { get; set; }
/// <summary>
/// 是否允許展示
/// </summary>
public bool AllowShow { get; set; }
/// <summary>
/// 瀏覽量
/// </summary>
public int ViewCount { get; set; }
}
}
其中的屬性:CreatedAt,PublishedAt,IsDeleted 類型都和領域模型Post.cs實體類中的數據類型不同了。
配置實體映射
接下來,我們回到項目[TsBlog.AutoMapperConfig]項目,在項目引用中添加如下引用:
TsBlog.Domain
TsBlog.ViewModel
再創建三個類文件,分別為:AutoMapperConfiguration.cs,AutoMapperStartupTask.cs,MappingExtensions.cs。
代碼分別為:
AutoMapperConfiguration.cs
using AutoMapper;
using TsBlog.Domain.Entities;
using TsBlog.ViewModel.Post;
namespace TsBlog.AutoMapperConfig
{
/// <summary>
/// AutoMapper的全局實體映射配置靜態類
/// </summary>
public static class AutoMapperConfiguration
{
public static void Init()
{
MapperConfiguration = new MapperConfiguration(cfg =>
{
#region Post
//將領域實體映射到視圖實體
cfg.CreateMap<Post, PostViewModel>()
.ForMember(d => d.IsDeleted, d => d.MapFrom(s => s.IsDeleted ? "是" : "否")) //將布爾類型映射成字符串類型的是/否
;
//將視圖實體映射到領域實體
cfg.CreateMap<PostViewModel, Post>();
#endregion
});
Mapper = MapperConfiguration.CreateMapper();
}
public static IMapper Mapper { get; private set; }
public static MapperConfiguration MapperConfiguration { get; private set; }
}
}
AutoMapperStartupTask.cs
namespace TsBlog.AutoMapperConfig
{
/// <summary>
/// AutoMapper初始化類
/// </summary>
public class AutoMapperStartupTask
{
public void Execute()
{
AutoMapperConfiguration.Init();
}
}
}
MappingExtensions.cs
using TsBlog.Domain.Entities;
using TsBlog.ViewModel.Post;
namespace TsBlog.AutoMapperConfig
{
/// <summary>
/// 數據庫表-實體映射靜態擴展類
/// </summary>
public static class MappingExtensions
{
public static TDestination MapTo<TSource, TDestination>(this TSource source)
{
return AutoMapperConfiguration.Mapper.Map<TSource, TDestination>(source);
}
public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
{
return AutoMapperConfiguration.Mapper.Map(source, destination);
}
#region Post
public static PostViewModel ToModel(this Post entity)
{
return entity.MapTo<Post, PostViewModel>();
}
public static Post ToEntity(this PostViewModel model)
{
return model.MapTo<PostViewModel, Post>();
}
#endregion
}
}
到此,AutoMapper的映射配置完成。
AutoMapper的應用
初始化AutoMapper的配置
打開WEB項目[TsBlog.Frontend],引用項目[TsBlog.AutoMapperConfig],再在全局配置文件Global.asax中,添加AutoMapper的初始化方法:
/// <summary>
/// AutoMapper的配置初始化
/// </summary>
private void AutoMapperRegister()
{
new AutoMapperStartupTask().Execute();
}
同時在 Application_Start 方法中調用,此時的Global.asax文件代碼如下:
using Autofac;
using Autofac.Integration.Mvc;
using System.Web.Mvc;
using System.Web.Routing;
using TsBlog.AutoMapperConfig;
using TsBlog.Repositories;
using TsBlog.Services;
namespace TsBlog.Frontend
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
//BundleConfig.RegisterBundles(BundleTable.Bundles);
AutofacRegister();
AutoMapperRegister();
}
private void AutofacRegister()
{
var builder = new ContainerBuilder();
//注冊MvcApplication程序集中所有的控制器
builder.RegisterControllers(typeof(MvcApplication).Assembly);
//注冊倉儲層服務
builder.RegisterType<PostRepository>().As<IPostRepository>();
//注冊服務層服務
builder.RegisterType<PostService>().As<IPostService>();
//注冊過濾器
builder.RegisterFilterProvider();
var container = builder.Build();
//設置依賴注入解析器
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
/// <summary>
/// AutoMapper的配置初始化
/// </summary>
private void AutoMapperRegister()
{
new AutoMapperStartupTask().Execute();
}
}
}
到此,AutoMapper的安裝、配置就基本完成了,接下來我們將學習在WEB項目[TsBlog.Frontend]的控制器操作中如何使用AutoMapper。
使用AutoMapper
1.打開WEB項目[TsBlog.Frontend],添加對TsBlog.ViewModel的引用。
2.打開HomeController.cs,將代碼修改為:
using System.Web.Mvc;
using TsBlog.AutoMapperConfig;
using TsBlog.Services;
namespace TsBlog.Frontend.Controllers
{
public class HomeController : Controller
{
private readonly IPostService _postService;
public HomeController(IPostService postService)
{
_postService = postService;
}
public ActionResult Index()
{
return View();
}
public ActionResult Post()
{
//var postRepository = new PostRepository();
//var post = postRepository.FindById(1);
//return View(post);
var post = _postService.FindById(1).ToModel();
return View(post);
}
}
}
其中,我們將:
var post = _postService.FindById(1);
修改成了:
var post = _postService.FindById(1).ToModel();
再打開視圖文件:~/Views/Home/Post.cshtml,將
@model TsBlog.Domain.Entities.Post
修改成:
并添加部分測試AutoMapper映射字段的代碼,
此時的 Post.cs:
@model TsBlog.ViewModel.Post.PostViewModel
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Post find by id test</title>
</head>
<body>
<div>
<p>Post id:@Model.Id</p>
<p>Post Title:@Model.Title</p>
<p>Post PublishedAt:@Model.PublishedAt</p>
<p>Post IsDeleted:@Model.IsDeleted</p>
</div>
</body>
</html>
打開數據庫,確保PublishedAt字段中值。
再次按F5運行,打開頁面[http://localhost:54739/home/post]

本文的源碼托管地址:https://github.com/lampo1024/TsBlog/releases/tag/v1.5
本文學習到此結束,本系列未完待續,我們下期再見……
如果你喜歡Rector的本系列文章,請為我點個大大的贊,以支持Rector在后續的寫作中更有基(激)情,哈哈。。。
本文同步發表至 圖享網 《一步一步創建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)》