AutoMapper - 如何使用ConstructedBy方法将参数传递到自定义解析器?

Bry*_*yan 6 .net c# asp.net-mvc viewmodel automapper

在我的ASP.NET MVC 2(RC)项目中 - 我使用AutoMapper在Linq到Sql类(Media)和视图模型(MediaVM)之间进行映射.视图模型具有SelectList属性,用于视图中的下拉列表.我有一个自定义值解析器来填充从数据库中选择列表的属性项,但不知道是否有(使用ConstructedBy方法?)的)定义选择的项目和b通过从源模型一对夫妇的值到解析器的方式)过滤数据库中的项目.源对象被传递到自定义解析 - 但是解析器对不同类型的源对象的几种不同的视图模型使用,所以宁可确定从哪里我的测绘配置得到的值.这是我的视图模型:

public class MediaVM
{
    public bool Active { get; set; }
    public string Name { get; set; }

    [UIHint("DropDownList")]
    [DisplayName("Users")]
    public SelectList slUsers { get; private set; }
}        
Run Code Online (Sandbox Code Playgroud)

automapper映射配置:

    Mapper.CreateMap<Media, MediaVM>()
        .ForMember(dest => dest.slUsers, opt => opt.ResolveUsing<UsersSelectListResolver>());
Run Code Online (Sandbox Code Playgroud)

能够在.ForMember映射子句上执行类似的操作会很高兴:

.ConstructedBy(src => new UsersSelectListResolver(src.UserID, src.FilterVal))
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?

Jim*_*ard 8

我喜欢这个想法作为功能请求.您可以使用MapFrom立即执行此类操作:

ForMember(dest => dest.slUsers, opt => opt.MapFrom(src => new UsersSelectListResolver(src).Resolve(src));
Run Code Online (Sandbox Code Playgroud)


use*_*343 2

我发现你的帖子试图做同样的事情。我决定采用一种简单的方法,并跳过尝试直接通过 AutoMaper 映射到我的选择列表。我只需将一个数组返回到我的 ViewModel 中,并为我的选择列表引用该对象。数组被映射,选择列表对象没有。简单、有效。而且,恕我直言,每个人都在执行其预期的任务 - 映射器进行映射,ViewModel 进行布局

View Model code:
        [DisplayName("Criterion Type")]
        public virtual CriterionType[] CriterionTypes { get; set; }

        [DisplayName("Criterion Type")]
        public SelectList CriterionTypeList
        {
            get
            {
                return new SelectList(CriterionTypes, "Id", "Key");
            }
        }  
Run Code Online (Sandbox Code Playgroud)

我的映射器:

 Mapper.CreateMap<Criterion, CriterionForm>()
            .ForMember(dest => dest.CriterionTypeList, opt => opt.Ignore());     
Run Code Online (Sandbox Code Playgroud)