繁体   English   中英

使用 Automapper 映射两个集合时如何使用 BeforeMap Action?

[英]How to use BeforeMap Action when mapping two Collections with Automapper?

使用 automapper 映射两个单个对象时, BeforeMap操作工作正常:

return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
    opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});

但是当映射两个集合时, BeforeMap不起作用,因为srcdest现在是object类型:

return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
    opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});

我需要为映射本身提供语言,所以我无法在映射后设置它。 映射两个集合时,如何将提供的语言传递给目标对象?

我初步是这样解决的:

        var result = new List<ProjectDto>();
        foreach (var item in projects)
        {
            var dest = new ProjectDto() { ProvidedLanguage = requestedLanguage };
            result.Add(_mapper.Map(item, dest));
        }

我知道,它看起来并不优雅。 如果有人知道更好的解决方法,请不要犹豫,分享您的想法。

使用BeforeMap()来调整目标对象是危险的。 运行你的代码:

return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
    opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});

将导致NullReferenceException因为dest对象尚未被 AutoMapper 初始化。 看, BeforeMap()最适合对对象执行一些调整,因为对目标对象的任何工作都可以被即将到来的映射过程覆盖。 如果您想对目标对象进行调整,最好使用AfterMap() 这样,您的映射过程就已经结束,并且您的目标对象已被初始化。 我并不是说你不应该使用BeforeMap() ,我只是说要谨慎使用它,并在你真正知道自己在做什么时使用它。

至于映射集合,它们似乎是object类型,但这正是它们的样子。 在调试器中放置一个断点以查看它们的类型是否正确。

而且您将无法在IEnumerable上设置ProvidedLanguage属性。 如果要在IEnumerable内的每个ProjectDto上设置该属性,请为此使用foreach循环:

return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
    opt.AfterMap((source, destination) =>
    {
        foreach (var dto in destination)
        {
            dto.ProvidedLanguage = requestedLanguage;
        }
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM