上一篇文章(https://www.cnblogs.com/meowv/p/12961014.html)集成了准时义务处置框架Hangfire,完成了一个简朴的准时义务处置解决方案。

本篇紧接着来玩一下AutoMapper,AutoMapper可以很利便的搞定我们工具到工具之间的映射关系处置,同时abp也帮我们是现实了IObjectMapper接口,先凭据官方文档:https://docs.abp.io/zh-Hans/abp/latest/Object-To-Object-Mapping ,将AutoMapper添加依赖到项目中。

.Application层模块类中添加AbpAutoMapperModule模块依赖。

//MeowvBlogApplicationModule.cs
using Meowv.Blog.Application.Caching;
using Volo.Abp.AutoMapper;
using Volo.Abp.Identity;
using Volo.Abp.Modularity;

namespace Meowv.Blog.Application
{
    [DependsOn(
        typeof(AbpIdentityApplicationModule),
        typeof(AbpAutoMapperModule),
        typeof(MeowvBlogApplicationCachingModule)
    )]
    public class MeowvBlogApplicationModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            ...
        }
    }
}

在本项目中,主要处置的就是实体和DTO之前的映射关系,以之前写的BlogService.cs中的增删改查为例,将Post.csPostDto.cs相互映射。

先看GetPostAsync(int id)这个方式,之前的做法是手动建立工具,然后为其一个一个的赋值,可以想象当我们的字段超级多的时刻,都得写一遍。现在有了AutoMapper,一句代码就可以搞定。

public async Task<ServiceResult<PostDto>> GetPostAsync(int id)
{
    var result = new ServiceResult<PostDto>();

    var post = await _postRepository.GetAsync(id);
    if (post == null)
    {
        result.IsFailed("文章不存在");
        return result;
    }

    //var dto = new PostDto
    //{
    //    Title = post.Title,
    //    Author = post.Author,
    //    Url = post.Url,
    //    Html = post.Html,
    //    Markdown = post.Markdown,
    //    CategoryId = post.CategoryId,
    //    CreationTime = post.CreationTime
    //};

    var dto = ObjectMapper.Map<Post, PostDto>(post);

    result.IsSuccess(dto);
    return result;
}

ObjectMapperApplicationService中已经被注入,我们的继续了ServiceBase,可以直接使用。

到这里还没完,其中最主要的一步就是界说类与类之间的映射关系,AutoMapper提供了多种界说类之间映射的方式,有关详细信息请参阅AutoMapper的文档:https://docs.automapper.org/

其中界说一种映射的方式是建立一个Profile 类,在.Application层添加MeowvBlogAutoMapperProfile.cs,直接继续Profile在组织函数中界说即可。

//MeowvBlogAutoMapperProfile.cs
using AutoMapper;
using Meowv.Blog.Application.Contracts.Blog;
using Meowv.Blog.Domain.Blog;

namespace Meowv.Blog.Application
{
    public class MeowvBlogAutoMapperProfile : Profile
    {
        public MeowvBlogAutoMapperProfile()
        {
            CreateMap<Post, PostDto>();

            CreateMap<PostDto, Post>().ForMember(x => x.Id, opt => opt.Ignore());
        }
    }
}

界说两个规则,第一个:从Post映射到PostDto,由于PostDto所有属性在Post中都是存在的,以是直接CreateMap<>即可;第二个:从PostDto映射到Post,由于Post中存在Id属性,而在PostDto中是没有的,以是可以使用ForMember(...)来忽略掉Id属性。

界说好映射规则后,在模块类中添加使用。

//MeowvBlogApplicationModule.cs
...
	public override void ConfigureServices(ServiceConfigurationContext context)
	{
	    Configure<AbpAutoMapperOptions>(options =>
	    {
	        options.AddMaps<MeowvBlogApplicationModule>(validate: true);
	        options.AddProfile<MeowvBlogAutoMapperProfile>(validate: true);
	    });
	}
...

使用同样的方式修改一下InsertPostAsync(PostDto dto)方式的代码。

public async Task<ServiceResult<string>> InsertPostAsync(PostDto dto)
{
    var result = new ServiceResult<string>();

    //var entity = new Post
    //{
    //    Title = dto.Title,
    //    Author = dto.Author,
    //    Url = dto.Url,
    //    Html = dto.Html,
    //    Markdown = dto.Markdown,
    //    CategoryId = dto.CategoryId,
    //    CreationTime = dto.CreationTime
    //};

    var entity = ObjectMapper.Map<PostDto, Post>(dto);

    var post = await _postRepository.InsertAsync(entity);
    if (post == null)
    {
        result.IsFailed("添加失败");
        return result;
    }

    result.IsSuccess("添加乐成");
    return result;
}

解放了双手,代码也变少了,真香,去测试一下用了工具映射后的接口是否好使。

可以看到,效果也是可以出来的,后续都将根据上面的方式大量用到工具映射。

顺便先容.HttpApi.Hosting层几个设置属性。

路由规则设置,默认Swagger中的路由是大写的,若是我想转成小写可以使用以下设置代码,都写在模块类MeowvBlogHttpApiHostingModule.cs中。

public override void ConfigureServices(ServiceConfigurationContext context)
{
...
	context.Services.AddRouting(options =>
	{
	    // 设置URL为小写
	    options.LowercaseUrls = true;
	    // 在天生的URL后面添加斜杠
	    options.AppendTrailingSlash = true;
	});
...
}

使用HSTS的中间件,该中间件添加了严酷传输平安头。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
    ...
    app.UseHsts();
    ...
}

直接使用默认的跨域设置。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
    ...
    app.UseCors();
    ...
}

HTTP请求转HTTPS。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
    ...
    app.UseHttpsRedirection();
    ...
}

转发将标头代理到当前请求,配合 Nginx 使用,获取用户真实IP。

public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
    ...
    pp.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
    });
    ...
}

本篇先容了若何使用AutoMapper,搞定工具到工具间的映射,篇幅简短,内容比较简朴,你学会了吗?

开源地址:https://github.com/Meowv/Blog/tree/blog_tutorial

,

Allbet

www.ordsports.com欢迎进入欧博平台(Allbet Gaming),欧博平台开放欧博(Allbet)开户、欧博(Allbet)代理开户、欧博(Allbet)电脑客户端、欧博(Allbet)APP下载等业务。

Allbet Gaming声明:该文看法仅代表作者自己,与阳光在线无关。转载请注明:wdwbet :基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定工具映射
发布评论

分享到:

萍乡市人才网:【星二代】任达华爱女拍广告 任晴佳大骚43吋长腿
1 条回复
  1. 环球UG官网开户网址
    环球UG官网开户网址
    (2020-08-13 00:00:04) 1#

    欧博开户欢迎进入欧博开户平台(Allbet Game):www.aLLbetgame.us,欧博开户平台开放欧博Allbet开户、欧博Allbet代理开户、欧博Allbet电脑客户端、欧博AllbetAPP下载等业务。赞你一万年

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。