首页 > 编程语言 >ASP.NET Core-自动映射

ASP.NET Core-自动映射

时间:2024-07-17 12:30:31浏览次数:14  
标签:Core ASP string 映射 get set var NET public

1.安装NuGet包AutoMapper

 

2.建立示例Entity、Dto

Entity

 public class User 
 {
     public long Id { get; set; }
     /// <summary>
     /// 账号
     /// </summary>
     public string UserName { get; set; }

     /// <summary>
     /// 名字
     /// </summary>
     public string Name { get; set; }

     public string Password { get; set; }

     /// <summary>
     /// 用户是否锁定
     /// </summary>
     public bool IsLockoutEnabled { get; set; }

     public string PhoneNumber { get; set; }

 }

Dto

 public class UserDto
 {
     public string UserName { get; set; }

     /// <summary>
     /// 名字
     /// </summary>
     public string Name { get; set; }

     public string Password { get; set; }

     /// <summary>
     /// 用户是否锁定
     /// </summary>
     [PropertyMapper(SourceName = "IsLockoutEnabled")]
     public bool IsLock { get; set; }

     public string PhoneNumber { get; set; }
 }

 

3.配置映射关系-AutoMapperMappingProfile

/// <summary>
/// 这里的 Profile作用是Program中services.AddAutoMapper时它会自动找到所有继承了Profile的类然后进行配置
/// </summary>
public class AutoMapperMappingProfile:Profile
{
    public AutoMapperMappingProfile() {
        CreateMap<User, UserDto>().ReverseMap();//ReverseMap双向映射
    }

}

注:默认是字段同名自动映射,若字段不同名则需要设定映射规则

 

4.Program.cs中注入映射服务

builder.Services.AddAutoMapper(typeof(AutoMapperMappingProfile));

 

5.使用

[ApiController]
[Route("[controller]")]
public class UserController(IUserService userService,IMapper mapper) : ControllerBase
{
    
    [HttpGet("GetSingleUserInfo")]
    public async Task<UserDto> GetSingleUserInfo(string account)
    {
        var info= await userService.GetSingleUserInfo(account);
        return mapper.Map<UserDto>(info);
    }
}

 

映射配置改进

针对以上的映射来说,每次有新的映射关系都需要到AutoMapperMappingProfile配置文件中配置,这种方式操作起来显得繁琐,还可能会遗忘,为了方便操作,做了以下改进,让每一个映射关系自动加入到配置中

1.建立特性PropertyMapperAttribute

 /// <summary>
 /// ValidOn 规定特性可被使用的范围它是枚举器 AttributeTargets的值的组合。默认值是 AttributeTargets.All表示在所有元素都可使用。如果只允许在类或者属性上使用可以定义:AttributeTargets.Class或者AttributeTargets.Property
 /// AllowMultiple(可选的)bool类型。如果为 true,则该特性是多用的。默认值是 false(单用的)
 /// Inherited(可选的)bool类型。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)
 /// </summary>
 [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
 public class PropertyMapperAttribute:Attribute
 {
     public string SourceName { get; set; }
     //public Type SourceType { get; set; }
 }

 

2.在需要映射的Dto中添加特性

AutoMapAttribute,AutoMapper包自带的特性用于明确映射对象,添加至类中

PropertyMapperAttribute,用于属性的特性,本次用来表明映射的字段(当映射双方字段不相同时)

[AutoMap(typeof(User))]
public class UserDto
{
    public string UserName { get; set; }

    /// <summary>
    /// 名字
    /// </summary>
    public string Name { get; set; }

    public string Password { get; set; }

    /// <summary>
    /// 用户是否锁定
    /// </summary>
    [PropertyMapper(SourceName = "IsLockoutEnabled")]
    public bool IsLock { get; set; }

    public string PhoneNumber { get; set; }
}

 

3.映射配置文件改进-BatchAutoMapperProfile

/// <summary>
/// 自动添加映射配置(需使用特性AutoMapAttribute的DTO)
/// </summary>
public class BatchAutoMapperProfile:Profile
{
    public BatchAutoMapperProfile()
    {
        InitMapper();
    }

    private void InitMapper()
    {//寻找应用中所有包含TestApp(应用名称)的程序集,且找程序集中名称中带Dto的类
        var allTypeses = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName.Contains("TestApp")).SelectMany(a => a.GetTypes()).Where(a=>a.Name.Contains("Dto")).ToArray();//.Where(a => a.FullName.Contains("PlantAtlas.Interface")|| a.FullName.Contains("PlantAtlas.Server")).ToArray();

        //类映射配置
        var typeList =allTypeses.Where(t=>t.GetCustomAttributes(typeof(AutoMapAttribute)).Any()).ToList();//过滤类中带有AutoMapAttribute特性标签的类
        typeList.ForEach(type =>
        {
            var attribute = (type.GetCustomAttributes(typeof(AutoMapAttribute)).FirstOrDefault());
            if (attribute != null)
            {
                var a = (AutoMapAttribute)attribute;
                if (a.SourceType == null) return;
                var mapper = CreateMap(a.SourceType, type);//.ReverseMap();
                //类属性映射配置
                var propertyList = type.GetProperties().Where(t => t.GetCustomAttributes(typeof(PropertyMapperAttribute)).Any()).ToList();//过滤出带有PropertyMapperAttribute特性的属性做特殊映射
                propertyList.ForEach(pro =>
                {
                    var property = pro.GetCustomAttributes<PropertyMapperAttribute>().FirstOrDefault();
                    if (property != null && !string.IsNullOrEmpty(property.SourceName))
                    {
                        mapper.ForMember(pro.Name, src => src.MapFrom(property.SourceName));
                    }
                });
                mapper.ReverseMap();//ReverseMap表示双向映射
            }
        });
        
    }
}

 

4.Program.cs中注入映射服务

//自动映射
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

注:AddAutoMapper中传入的参数表明是那个范围内找所有继承了Profile的类然后进行配置

 

标签:Core,ASP,string,映射,get,set,var,NET,public
From: https://www.cnblogs.com/sugarwxx/p/18305592

相关文章

  • iOS开发基础110-Core Graphics应用场景
    CoreGraphics是一种强大的二维图形绘制框架,广泛应用于iOS开发中。以下是几个常见的运用场景以及对应的代码示例:1.自定义视图绘制通过覆盖UIView的drawRect:方法,可以自定义视图的外观。示例代码:#import<UIKit/UIKit.h>@interfaceCustomView:UIView@end@implementat......
  • YOLOv10改进 | 注意力篇 | YOLOv10引入ParNetAttention注意力
    1. ParNetAttention介绍1.1 摘要:深度是深度神经网络的标志。但是,深度越大,意味着顺序计算越多,延迟也越长。这就引出了一个问题--有没有可能建立高性能的“非深度”神经网络?我们证明了这一点。为此,我们使用并行子网,而不是一层接一层堆叠。这有助于在保持高性能的同时有效地......
  • YOLOv10改进 | 独家创新- 注意力篇 | YOLOv10引入结合EMAttention和ParNetAttention形
    1.EPAAttention介绍     EPAAttention注意力机制综合了EMAttention和ParNetAttention的优势,能够更有效地提取图像特征。     (1).综合性与多样性     EPAAttention结合了两种不同的注意力机制,充分利用了EMAttention的分组归一化和特征增强......
  • NetCore消息管道 Middleware
    中间件定义///<summary>///自定义中间件1///</summary>publicclassMyMiddleware:IMiddleware{publicasyncTaskInvokeAsync(HttpContextcontext,RequestDelegatenext){Console.WriteLine("MyMiddleware_1,开始处理");aw......
  • Asp .Net Core 系列:基于 T4 模板生成代码
    目录简介组成部分分类VisualStudio中使用T4模板创建T4模板文件2.编写T4模板3.转换模板中心控制Manager根据MySQL数据生成实体简介T4模板,即TextTemplateTransformationToolkit,是微软官方在VisualStudio中引入的一种代码生成引擎。自VisualStudio2008开始,T4模板就被......
  • ASP.NET Core 集成 AutoMapper 的介绍和实际开发应用
    目录一、介绍二、原理三、实际开发应用1.安装AutoMapper包2.创建映射配置3.初始化AutoMapper4.使用AutoMapper进行数据映射5.注意事项和拓展四、总结一、介绍AutoMapper是一个对象-对象映射器(OOM),它主要用于在.NET应用程序中实现对象之间的自动转换。在ASP.NET......
  • 学懂C#编程:常用框架学习(三)——.NET Framework框架下的Entity Framework (EF)开发应用详
            目录一、EntityFramework概述二、EntityFramework的核心组成部分EntityDataModel(EDM):EntityClient:ObjectServices:ADO.NETProvider:三、分层结构应用程序层:EntityFramework层:数据库层:四、EF主要的功能包括五、三种开发模式详解1.代码......
  • dotnet netcore web api 部署 IIS windows 部署 windows server
    .NetCore部署IIS一、服务器环境配置1.1安装ASP.NETCore模块/托管捆绑包ASP.NETCore不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,为了能部署在IIS,必须先安装AspNetCoreModuleV2。安装方式一:安装ASP.NETCore运行时(推荐)下载地址:htt......
  • WPF read data from mysql and display via ADO.NET
    //xaml<Windowx:Class="WpfApp216.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • 【Azure Developer】C#/.NET 静态函数中this关键字的作用
    问题描述在查看.NET代码的时候,发现一个静态方法,第一个参数使用this关键字,它在这里是什么作用呢?publicstaticXElementAquireElement(thisXContainercontainer,stringname,booladdFirst=false){... 问题解答通过查看微软的官方博文介......