AutoMapper: почему UseValue выполняется только один раз - PullRequest
15 голосов
/ 12 января 2011

Почему UseValue выполняется только один раз?Мне нужно вызывать TeamRepository для каждого запроса.

Как мне этого добиться?

Отображение из TeamEmployee в TeamEmployeeInput:

CreateMap<TeamEmployee, TeamEmployeeInput>()
    .ForMember(x => x.Teams, x => x.UseValue(GetTeamEmployeeInputs()))
    .ForMember(d => d.SelectedTeam, s => s.MapFrom(x => x.Team == null ? 0 : x.Team.Id));

private IEnumerable<TeamDropDownInput> GetTeamEmployeeInputs()
{
    Team[] teams = CreateDependency<ITeamRepository>().GetAll();
    return Mapper.Map<Team[], TeamDropDownInput[]>(teams);
}

Объект домена:

public class TeamEmployee : Entity
{
    public virtual Employee Employee { get; set; }
    public virtual Team Team { get; set; }
}

Просмотр объектов модели:

public class TeamEmployeeInput
{
    public int? Id { get; set; }
    public string EmployeeLastName { get; set; }
    public string EmployeeEMail { get; set; }
    public string EmployeeFirstName { get; set; }

    public int SelectedTeam { get; set; }

    public IList<TeamDropDownInput> Teams { get; set; }
}


public class TeamDropDownInput : IDropdownList
{
    public int Id { get; set; }
    public string Text { get; set; }
}

1 Ответ

25 голосов
/ 12 января 2011

Попробуйте вариант MapFrom. Он предоставляет делегата, который будет вызываться каждый раз, когда происходит map . Из быстрого теста DateTime и моего командного окна это похоже на работу.

Что-то вроде:

public class Foo {
    public DateTime bar { get; set; }
}

public class Foo1
{
    public DateTime bar1 { get; set; }
}
Mapper.CreateMap<Foo, Foo1>()
    .ForMember(x => x.bar1, opt => opt.MapFrom(x => DateTime.Now)); // not using x, your function returns the value for bar1

Я должен отметить, что AutoMapper не предназначен для работы. AutoMapper должен отобразить свойства из одной модели в другую. Поэтому, если данные не существуют в modelA, вы не должны сопоставлять эти данные с modelB.

Ваше изменение кода будет:

CreateMap<TeamEmployee, TeamEmployeeInput>()
    .ForMember(x => x.Teams, x => x.MapFrom(x => GetTeamEmployeeInputs()))
...