前言

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.LibrariesTsBlog.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 Postpublic 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

修改成:

@model TsBlog.ViewModel.Post.PostViewModel

并添加部分测试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](五)》

一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)相关推荐

  1. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](二)>我们通过如下操作: 创建实体及工具类 创建Re ...

  2. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)

    前言 上一篇<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](三)>,我们完成了: * 引用SqlSugar * ...

  3. 如何从多个项目创建 ASP.NET 应用程序以进行组开发

    开发大型网站经常会涉及多个开发人员.这些开发人员必须能够在互不干扰的情况下开发 Web 应用程序的特定部分,同时仍能够在项目过程中与他人相互协作.为此,您可以在 Visual Studio .NET ...

  4. ASP.NET MVC5(一):ASP.NET MVC概览

    ASP.NET MVC概览 ASP.NET MVC是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. ASP.NET MVC模 ...

  5. 一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 - 强烈推荐!!!

    一步一步学习ASP.NET MVC 1.0创建NerdDinner 范例程序 本文根据<Professional ASP.NET MVC 1.0>中微软牛人Scott Guthrie 提供 ...

  6. 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序

    超级简单:一步一步教你创建一小型的asp.net mvc 应用程序 这本教程中将帮助你创建一个小型的asp.net mvc示例. 在本教程中,我们将创建自己的 Model , View 和Contro ...

  7. 一步一步SharePoint 2007之十二:实现Form认证(2)——创建添加管理帐户的工程

    摘要 本篇文章将记录实现Form认证的第二部分--创建添加管理帐户的工程.为了完成本部分的操作,希望您已经安装了Microsoft Visual Studio 2005:) 之所以要创建添加管理帐户的 ...

  8. (转)一步一步Asp.Net MVC系列_权限管理设计起始篇

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html 前一段时间,写了一步一步asp.net的一系列博客,最近,也快要 ...

  9. (转)一步一步Asp.Net MVC系列_权限管理之权限控制

    原文地址:http://www.cnblogs.com/mysweet/archive/2012/08/05/2623687.html 在权限管理中一个很重要的就是关于权限的拦截验证问题,特别是我们在 ...

最新文章

  1. NeurIPS 2020 | 自步对比学习:充分挖掘无监督学习样本
  2. redhat linux修改乱码
  3. system(“”start calc“”)
  4. junit 5测试异常处理_在JUnit中处理异常的3种方式。 选择哪一个?
  5. event auto模式的问题
  6. cuda+cudnn安装(cudnn下载失败解决),环境配置以及遇到的问题记录!
  7. 多功能下拉分页选择插件SelectPage插件 http://www.jq22.com/jquery-info14227
  8. 国际大牌在中国的故事
  9. python装饰器两层和三层区别,Python装饰器和装饰器图案有什么区别?
  10. 早期日语笔记----日语从入门到入土笔记
  11. Ardunio开发:esp32—cam摄像头
  12. 发布infopath模板到sharepoint站点(Infopath 2007)
  13. 关于IPB帧与恒定比特率、动态比特率的详解
  14. 玩转 Windows 10 中的 Linux 子系统
  15. Unity3D学习:结合Kinect进行游戏开发 | 孤舟博客
  16. heroku搭建mysql_在heroku上部署Flask应用程序并将其连接到颚数据库mysql数据库
  17. APMServ启动失败解决方法
  18. Linux配置ssh远程连接服务
  19. v-show和v-if
  20. 给你的钥匙贴个标签,就不用担心找不到了

热门文章

  1. debian 升级后mysql_教你在Debian和Ubuntu上升级MySQL
  2. RocketMQ事务消息从生产到消费原理详解(包括回查过程)
  3. Java高并发编程详解系列-Guarded Suspension设计模式
  4. 如何管理kvm虚拟机的时钟源
  5. Zookeeper的ZAB协议和Leader选举过程剖析
  6. Python爬虫入门_之urllib2urllib
  7. 消息中间件的核心思想
  8. Kafka与RocketMQ的对比分析
  9. Docker核心技术之联合文件系统
  10. 阻塞和非阻塞队列下两种生产者消费者实现