接下来创设一个类来承接AutoMapper的

 

前言

Hi,大家好,我是Rector

时光飞逝,一个礼拜又过去了,明天要么星期四,Rector在图享网雄起雌伏跟我们享用种类文件:一步一步创造ASP.NET
MVC5程序[Repository+Autofac+Automapper+SqlSugar]

上一篇《一步一步制造ASP.NET
MVC5程序[Repository+Autofac+Automapper+SqlSugar](四)
》,大家做到了:

  • 始建服务层:TsBlog.Services
  • 开创服务接口
  • 兑现劳务接口
  • 创立仓储接口
  • 安装Autofac依赖注入组件
  • 注册配置Autofac 注重注入

里面,最重要的是在类型中引进注重注入组件:Autofac并布署及简便的应用。本文大家将三翻五次本类别教程。

  首先须求在NuGet中引用AutoMapper的类库

正文知识要点

  • AutoMapper是何许简述
  • 安装AutoMapper
  • AutoMapper的配置
  • AutoMapper的应用
install-package   AutoMapper
install-package   AutoMapper.Extensions.Microsoft.DependencyInjection

AutoMapper 简述

图片 1

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-05-01.png

什么是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项目,如下图:

图片 2

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-05-02.png

入选刚才创制的档期的顺序[TsBlog.AutoMapperConfig],展开程序包管控台,选中暗中认可项目为[1.Libraries\TsBlog.AutoMapperConfig],输入Nuget包安装命令,如下:

图片 3

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-05-03.png

按Enter(回车)进行安装,本文写作时的AutoMapper版本是AutoMapper.6.2.2。

public class User
{
        public int ID { get; set; }
        public string Name { get; set; }
}

public class UserDto
{
        public int ID { get; set; }
        public string Name { get; set; }
}

AutoMapper的配置

为了减轻方案的目录结构特别明显,小编这边把视图实体放到了叁个独立的门类中。所以,再在缓慢解决方案目录[1.Libraries]下创办贰个名称为[TsBlog.ViewModel]的体系,这几个类型只贮存关于视图实体的类公事。
为了本文的亲自去做,在TsBlog.ViewModel项目中开创Post文件夹,再创造一个PostViewModel.cs的视图类,此时的消除方案目录为:

图片 4

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-05-04.png

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实体类中的数据类型不相同了。

  然后再创立二个标记接口IProfile

布署实体映射

接下去,大家回去项目[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的投射配置实现。

internal interface IProfile
    {
    }

AutoMapper的应用

 
 接下来创建三个类来承袭AutoMapper的Profile类与达成刚才创设的标记接口IProfile,并且在构造函数中配置关系映射

初始化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。

 public class MyProfile: Profile,IProfile
    {
        public MyProfile()
        {
            CreateMap<User, UserDto>();
            CreateMap<UserDto, User>();
        }

    }

使用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\]

图片 5

create-aspnet-mvc-5-web-application-repository-autofac-automapper-sqlsugar-step-by-step-05-05.png

正文的源码托管地址:https://github.com/lampo1024/TsBlog/releases/tag/v1.5

正历史学习到此截止,本类别未完待续,大家上一期再见……

一经您喜欢Rector的本种类文章,请为本身点个大大的赞,以支撑Rector在一而再的著述中更有基(激)情,哈哈。。。

本文同步公布至 图享网
一步一步创制ASP.NET
MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

  然后再次创下制贰个类来注册涉嫌映射

public class Mappings
    {
        public static void RegisterMappings()
        {
            //获取所有IProfile实现类
            var allType =
            Assembly
               .GetEntryAssembly()//获取默认程序集
               .GetReferencedAssemblies()//获取所有引用程序集
               .Select(Assembly.Load)
               .SelectMany(y => y.DefinedTypes)
               .Where(type => typeof(IProfile).GetTypeInfo().IsAssignableFrom(type.AsType()));

            foreach (var typeInfo in allType)
            {
                var type = typeInfo.AsType();
                if (type.Equals(typeof(IProfile)))
                {
                    //注册映射
                    Mapper.Initialize(y =>
                    {
                        y.AddProfiles(type); // Initialise each Profile classe
                    });
                }
            }
        }

    }

 从上边代码能够看看使用标识接口来判别注册映射类举办挂号映射,

 最后只需在Startup类的ConfigureServices方法中加多服务和将Mappings加多到中间件就能够使用

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddAutoMapper();
            services.AddMvc();

        }

 public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            Mappings.RegisterMappings();
        }

 然后就可以利用automapper,

public class ValuesController : Controller
    {

        private IMapper _mapper { get; set; }
        public ValuesController([FromServices]IMapper mapper)
        {
            this._mapper = mapper;
        }

        // GET api/values
        [HttpGet]
        public UserDto Get()
        {
            User user = new User()
            {
                ID = 1,
                Name = "狗娃"
            };
            var dto = Mapper.Map<User, UserDto>(user);
            return dto;
        }
}

  因为core使用DI创立对象,所以只需增添构造函数就可以。