这是使用 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<TSource, TDestination>
...我不记得上次我看它是什么时候...所以这是我的错...你的代码是完全有效。
请注意,静态类TypeAdapterConfig<TSource, TDestination>
对GlobalSettings 进行所有更改。如果我们不使用一些直接依赖于TypeAdapterConfig
具体类型的ServiceMapper
,它会站在那里,仍然什么都不做。
【讨论】:
我使用了TypeAdapterConfig类,它获取两个参数作为TSource,TDestination 能否请您指导我找出我工作的错误 @MrCloner 我刚刚更新了答案,自从我上次看它以来,情况发生了很大变化。糟糕(XD)以上是关于这是使用 Mapper 映射实体和 dto 的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章