如何配置 AutoMapper 以将属性设置为对象的新实例?

问题描述 投票:0回答:2

我正在尝试使用 AutoMapper 自动映射我的模型以查看模型。

我有以下两个视图模型

public class CreateComment
{
    [Required]
    public int BlogId { get; set; }

    [Required]
    public string Message { get; set; }

    public CreateComment()
    {

    }

    public CreateComment(int? blogId)
    {
        if(blogId.HasValue)
        {
            BlogId = blogId.Value;
        }
    }
}

public class BlogViewModel 
{
    [Required]
    public string Title { get; set; }

    [Required]
    public string Body { get; set; }
    // There are more

    [Required]
    public int? Id { get; set; }

    [DataType("CommentDisplayViewModelTable")]
    public IEnumerable<CommentDisplayViewModel> Comments { get; set; }

    public CreateComment CreateCommentForm { get; set; }
}

每次映射此对象时,

CreateCommentForm
属性都应该是一个新实例。唯一不同的是,在创建
CreateCommentForm
的新实例时,我希望为我填充
BlogId
。这里的想法是用一个空的
CreateCommentForm
来构建 html 表单。

目前,当我配置映射器时,我忽略

CreateCommentForm
属性只是为了避免遇到 AutoMapper 异常。但是我如何通过将 Id 属性传递给对象来告诉自动映射器每次创建一个新实例?

mapper.CreateMap<Blog, BlogViewModel>().ForMember(dest => dest.CreateCommentForm , opts => opts.Ignore() );

如何通过使用 AutoMapper 传递

CreateCommentForm
属性来正确地将
Blog.Id
映射到新实例?

c# automapper
2个回答
3
投票

对于自定义对象创建,您可以使用

ResolveUsing

mapper.CreateMap<Blog, BlogViewModel>().ForMember(dest => dest.CreateCommentForm , opts => opts.ResolveUsing(src => new CreateComment(src.Id)) );

3
投票

ResolveUsing
现已弃用,Google 将我带到这里进行更新。

mapper.CreateMap<Blog, BlogViewModel>().ForMember(dest => dest.CreateCommentForm , opts => opts.MapFrom(src => new CreateComment(src.Id)) );

你现在应该使用

MapFrom
,就像上面的例子

文档链接; https://docs.automapper.org/en/stable/8.0-Upgrade-Guide.html

© www.soinside.com 2019 - 2024. All rights reserved.