【问题标题】:Is this the right way for mapping entities and dtos with using Mapper?这是使用 Mapper 映射实体和 dto 的正确方法吗?
【发布时间】: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

标签: asp.net-core entity-framework-core mapping automapper 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)
猜你喜欢
  • 2021-10-28
  • 1970-01-01
  • 2011-09-12
  • 2018-09-13
  • 2017-09-17
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
相关资源
最近更新 更多