Я сопоставляю ApplianceViewModel с ApplianceDTO.Каждое устройство имеет коллекцию ActionViewModels, которые сопоставлены с ActionDTO.Я хотел бы настроить маппер на игнорирование ActionViewModels, значение IsPersisted которого равно False.
Мои классы ViewModel ...
public interface IApplianceViewModel : INotifyPropertyChanged
{
ObservableCollection<IActionViewModel> Actions { get; set; }
// other properties removed for simplicity
}
public interface IActionViewModel : INotifyPropertyChanged
{
bool IsPersisted { get; set; }
// other properties removed for simplicity
}
Мои классы DTO ...
public class ApplianceDTO
{
public IEnumerable<ActionDTO> Actions { get; set; }
// other properties removed for simplicity
}
public class ActionDTO
{
// properties removed for simplicity
}
Я настроил свое отображение следующим образом ...
Mapper.CreateMap<IApplianceViewModel, ApplianceDTO>();
Mapper.CreateMap<IActionViewModel, ActionDTO>()
var appliance = new ApplianceViewModel {
Actions = new ObservableCollection<IActionViewModel>(
new List<IActionViewModel> {
new ActionViewModel { IsPersisted = true },
new ActionViewModel { IsPersisted = false }
}};
var applianceDTO = Mapper.Map<IApplianceViewModel, ApplianceDTO>(applianceDTO);
В настоящее время у моего applianceDTO будет два элемента в его коллекции Actions, но я хотел бы настроить свое отображение так, чтобыApplianceActionViewModel со свойством IsPersisted, установленным в false, не отображается.Могу ли я сделать это?
Обновление
Комментарий Omu привел меня к решению, использующему ValueResolver для сопоставления коллекции Actions.Я не очень доволен этим решением, но его лучший вариант доступен.
Сначала я создал собственный ValueResolver.
public class IsPersistedCollectionResolver : ValueResolver<IApplianceViewModel, IEnumerable<ActionDTO>>
{
protected override IEnumerable<ActionDTO> ResolveCore(IApplianceViewModel source)
{
return Mapper.Map<IEnumerable<IActionViewModel>, IEnumerable<ActionDTO>>(source.Actions.Where(x => x.IsPersisted));
}
}
Затем я изменил свой код, чтобы использовать его в конфигурации сопоставления..
Mapper.CreateMap<IApplianceViewModel, ApplianceDTO>()
.ForMember(dest => dest.Actions, opt => opt.ResolveUsing<IsPersistedCollectionResolver>());
Mapper.CreateMap<IActionViewModel, ActionDTO>();