这是使用 Mapper 映射实体和 dto 的正确方法吗?

Posted

技术标签:

【中文标题】这是使用 Mapper 映射实体和 dto 的正确方法吗?【英文标题】:Is this the right way for mapping entities and dtos with using Mapper? 【发布时间】:2021-11-20 19:06:40 【问题描述】:

我有一个作为服务的层并添加了一个作为映射器的类,我想把我的所有映射都放在这里。 我正在使用 asp.net core 5 和 Mapster 进行映射 我做对了吗? 这是我的代码:

public class Mapping

    public static void InitializeAutomapper()
    
        TypeAdapterConfig<BookMark, BookMarkDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Category, CategoryDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Comment, CommentDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Like, LikeDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Post, PostDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Role, RoleDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Status, StatusDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<Tag, TagDTO>.ForType().Map(dest => dest.Id, src => src.Id);
        TypeAdapterConfig<User, UserDTO>.ForType().Map(dest => dest.Id, src => src.Id);
    

【问题讨论】:

我复制了我的代码,我只需要一些帮助来了解如何在单独的部分中为实体和 DTO 定义 Mapster 【参考方案1】:

这是不对的...如果编译器没有对您大喊大叫...那么 IDE 本身就有问题。

据我所知,我们似乎想从 Mapster 创建一个映射配置。这样做:

// Somewhere we could access IServiceCollection
var config = new TypeAdapterConfig();
config.NewConfig<BookMark, BookMarkDTO>.ForType().Map(dest => dest.Id, src => src.Id);
config.NewConfig<Category, CategoryDTO>.ForType().Map(dest => dest.Id, src => src.Id);
config.NewConfig<Comment, CommentDTO>.Map(dest => dest.Id, src => src.Id);
config.NewConfig<Like, LikeDTO>.Map(dest => dest.Id, src => src.Id);
config.NewConfig<Post, PostDTO>.Map(dest => dest.Id, src => src.Id);
config.NewConfig<Role, RoleDTO>.Map(dest => dest.Id, src => src.Id);
config.NewConfig<Status, StatusDTO>.Map(dest => dest.Id, src => src.Id);
config.NewConfig<Tag, TagDTO>.Map(dest => dest.Id, src => src.Id);
config.NewConfig<User, UserDTO>.Map(dest => dest.Id, src => src.Id);

// Register config as singleton, ServiceMapper as scope.
services.AddSingleton(config);
// Make sure we have Mapster.DependencyInjection package installed
services.AddScoped<IMapper, ServiceMapper>();

// Using it be like
public IActionResult MapsterStaticMappingTest([FromServices] MapsterMapper.IMapper mapper)

    var book = new BookMark();
    var bookMap = mapper.From(book).AdaptToType<BookMarkDTO>();
    return Ok(bookMap);

代码是在 .Net 5、Mapster 7.2.0 上编写的

更新

当我回顾 Mapster 源时,那里有一个新的public static class TypeAdapterConfig&lt;TSource, TDestination&gt;...我不记得上次我看它是什么时候...所以这是我的错...你的代码是完全有效。

请注意,静态类TypeAdapterConfig&lt;TSource, TDestination&gt; 对GlobalSettings 进行所有更改。如果我们不使用一些直接依赖于TypeAdapterConfig 具体类型的ServiceMapper,它会站在那里,仍然什么都不做。

【讨论】:

我使用了TypeAdapterConfig类,它获取两个参数作为TSource,TDestination 能否请您指导我找出我工作的错误 @MrCloner 我刚刚更新了答案,自从我上次看它以来,情况发生了很大变化。糟糕(XD)

以上是关于这是使用 Mapper 映射实体和 dto 的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何将DTO映射到多个实体?

使用 Linq Select 将实体映射到 DTO 的最简洁方法?

如何在避免复杂对象的情况下将 dto 映射到实体

学习笔记 - MapStruct 映射工具

学习笔记 - MapStruct 映射工具

使用 Automapper,将 DTO 映射回实体框架,包括引用的实体