首页 > 解决方案 > 这是使用 Mapper 映射实体和 dto 的正确方法吗?

问题描述

我有一个作为服务的层并添加了一个作为映射器的类,我想把我所有的映射放在这里。我正在使用 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);
    }
}

标签: asp.net-coreentity-framework-coremappingautomappermapster

解决方案


这是不对的...如果编译器没有对您大喊大叫...那么 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<TSource, TDestination>那里有一个新的...我不记得上次我看它的时候...所以这是我的错...您的代码是完全有效的。

请注意,静态类在GlobalSettingsTypeAdapterConfig<TSource, TDestination>下进行所有更改。如果我们不使用直接依赖于具体类型的 some ,它会站在那里,仍然什么都不做。ServiceMapperTypeAdapterConfig


推荐阅读