【问题标题】:Creating maps for members using Automapper使用 Automapper 为成员创建地图
【发布时间】:2016-01-18 22:32:48
【问题描述】:

我开始使用 AutoMapper 并有一个问题。我遇到了这样的示例代码:

Automapper.Mapper.CreateMap<Book, BookViewModel>()
    .ForMember(dest => dest.Author,
               opts => opts.MapFrom(src => src.Author.Name));

所以这可以让我将一本书转换为书籍模型,然后将 src 映射到 src.author.name 属性,因为没有 1-1 映射。

为了确认,它确实自己反向工作,这意味着我现在需要明确地这样做:

Mapper.Mapper.CreateMap<BookViewModel, Book>()
    .ForMember(dest => dest.Author.Name,
               opts => opts.MapFrom(src => src.Author));

正确吗?因此,为了进一步确认,如果我有 50 个视图模型和视图,我实际上需要 100 个(一个用于输入,一个用于输出,加上 .ForMember 表达式中的任何其他代码行)

这是真的吗?这是一种常见的做法吗(即您可能会看到数百行代码来处理多个 DTO 的字段映射,这些 DTO 的属性不匹配 1-1)?

【问题讨论】:

标签: c# automapper


【解决方案1】:

CreateMap 为 AutoMapper 创建一个映射,以便稍后在需要时使用。这在您的应用程序的生命周期中只需要一次。为了使用您定义的这个映射,您只需要调用Automapper.Map 方法。因此,您不必一次又一次地创建映射。

例子:

var myBookViewModel = Automapper.Map<Book, BookViewModel>(myBook);

您说得对,为 Book 定义映射器到 BookViewModel 不会使 Automapper 为 BookViewModel 自动为您创建映射器。您必须创建映射器。

【讨论】:

  • 是的,我只需要在加载文件时完成一次,但我只是说事实上我必须在启动时拥有所有类似的代码。 . 好的,谢谢
【解决方案2】:

本质上是的,您基本上需要指定来回配置来处理每个 DTO 映射。如果没有确定性模式,则无法猜测当成员名称不同时,复杂对象之间的映射将如何工作,或者当您想要的属性在其他对象中更远时,例如在您的示例中。

不过,如果您遵循一些基本模式,Automapper 会相当聪明。在您的情况下,如果您将 DTO 属性名称更改为 AuthorName 而不是 Author,则 CreateMap 将正确映射而无需手动指定映射(他们称之为“扁平化”)。 Automapper 将even map methods to properties if they follow a GetProperty() => Property { get; set; } pattern。重命名您的 DTO 属性以遵循此模式可能会为您节省很多行。查看他们的 starters guide 了解其他简化映射的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2018-02-04
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多