AutoMapper - Как передать параметры в Custom Resolver с помощью метода ConstructedBy? - PullRequest
6 голосов
/ 15 января 2010

В моем проекте ASP.NET MVC 2 (RC) - я использую AutoMapper для сопоставления между классом Linq и Sql (Media) и моделью представления (MediaVM). Модель представления имеет свойство SelectList для раскрывающегося списка в представлении. У меня есть пользовательский преобразователь значений для заполнения элементов свойства SelectList из БД, но мне интересно, есть ли способ передать пару значений из исходной модели в преобразователь (с помощью метода ConstructedBy?) В ) отфильтровать элементы из БД. Исходный объект передается в пользовательский распознаватель, но распознаватель используется в нескольких разных моделях представления с разными типами исходных объектов, поэтому лучше определить, где получить значения в моей конфигурации сопоставления. Вот мой вид модели:

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

    [UIHint("DropDownList")]
    [DisplayName("Users")]
    public SelectList slUsers { get; private set; }
}        

Конфигурация отображения автомпера:

    Mapper.CreateMap<Media, MediaVM>()
        .ForMember(dest => dest.slUsers, opt => opt.ResolveUsing<UsersSelectListResolver>());

Было бы неплохо сделать что-то подобное в предложении отображения .ForMember:

.ConstructedBy(src => new UsersSelectListResolver(src.UserID, src.FilterVal))

Есть ли способ сделать это?

Ответы [ 2 ]

8 голосов
/ 17 января 2010

Мне нравится эта идея как запрос функции. Вы можете сделать что-то подобное прямо сейчас, с MapFrom:

ForMember(dest => dest.slUsers, opt => opt.MapFrom(src => new UsersSelectListResolver(src).Resolve(src));
2 голосов
/ 16 января 2010

Я обнаружил, что ваша публикация пытается сделать то же самое.Я выбрал простой подход и пропустил попытку привязать мой список выбора напрямую через 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");
            }
        }  

мой картограф:

 Mapper.CreateMap<Criterion, CriterionForm>()
            .ForMember(dest => dest.CriterionTypeList, opt => opt.Ignore());     
...