Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Automapper为成员创建地图_C#_Automapper - Fatal编程技术网

C# 使用Automapper为成员创建地图

C# 使用Automapper为成员创建地图,c#,automapper,C#,Automapper,我开始使用AutoMapper,有个问题。我遇到了如下示例代码: Automapper.Mapper.CreateMap<Book, BookViewModel>() .ForMember(dest => dest.Author, opts => opts.MapFrom(src => src.Author.Name)); Automapper.Mapper.CreateMap() .ForMember(dest=>dest.

我开始使用AutoMapper,有个问题。我遇到了如下示例代码:

Automapper.Mapper.CreateMap<Book, BookViewModel>()
    .ForMember(dest => dest.Author,
               opts => opts.MapFrom(src => src.Author.Name));
Automapper.Mapper.CreateMap()
.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));
Mapper.Mapper.CreateMap()
.FormMember(dest=>dest.Author.Name,
opts=>opts.MapFrom(src=>src.Author));
对吗?因此,为了进一步确认,如果我有50个视图模型和视图,我实际上需要100个(一个用于输入,一个用于输出,再加上.ForMember表达式中的任何额外代码行)


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

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

例如:

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

您的说法是正确的,为Book to BookViewModel定义映射器不会使Automapper自动为BookViewModel创建映射器以进行Book to Book。您必须创建映射器。

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

例如:

var myBookViewModel = Automapper.Map<Book, BookViewModel>(myBook);
var myBookViewModel=Automapper.Map(myBook);
您的说法是正确的,为Book to BookViewModel定义映射器不会使Automapper自动为BookViewModel创建映射器以进行Book to Book。您必须创建映射器。

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

然而,如果您遵循一些基本模式,Automapper是相当聪明的。在您的情况下,如果将DTO属性名称更改为
AuthorName
而不是
Author
,则
CreateMap
将正确映射,而无需手动指定映射(他们称之为“展平”)。汽车制造商会的。按照此模式重命名DTO属性可能会节省大量的行。查看它们的配置,寻找简化映射的其他方法。

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


然而,如果您遵循一些基本模式,Automapper是相当聪明的。在您的情况下,如果将DTO属性名称更改为
AuthorName
而不是
Author
,则
CreateMap
将正确映射,而无需手动指定映射(他们称之为“展平”)。汽车制造商会的。按照此模式重命名DTO属性可能会节省大量的行。查看一下它们,寻找其他简化映射的方法。

是的,我只需要在加载文件时编写一次,但我只是说,事实上,我必须在启动时编写所有类似的代码。。好的,谢谢,我只需要在加载文件时做一次,但我只是说,事实上,我必须在启动时有所有类似的代码。。好的,谢谢