AutoMapper: вручную задано свойство

Я использую AutoMapper для отображения из плоских DataObjects в жирные BusinessObjects и наоборот. Я заметил, что отображение из DataObjects в BusinessObjects занимает дополнительное время из-за уведомления об изменении BusinessObjects (реализует INotifyPropertyChanged с помощью специальной проверки и т.д.).

Поскольку я обычно не нуждаюсь в уведомлении об изменении во время сопоставления, я хотел бы отключить его. Поэтому я добавил свойство IsPropertyChangedEnabled. Если для этого свойства установлено значение false, событие NotifyPropertyChanged не создается и время сохраняется.

Вопрос:

Могу ли я сказать AutoMapper, чтобы установить это свойство в false в самом начале процесса сопоставления? Если да, то как?

Спасибо!

Ответ 1

Использовать метод BeforeMap для установки значения свойства перед процессом сопоставления:

Mapper.CreateMap<Source, Destination>()
      .BeforeMap((s, d) => d.IsPropertyChangedEnabled = false );

Ответ 2

Вы также можете использовать ForMember(), который имеет дополнительное преимущество для передачи стандартного unit test параметра Mapper.AssertConfigurationIsValid(), когда свойства, заданные значениями, не находятся в исходном объекте.

здесь пример

Mapper.CreateMap<ClientData, GenerateClientLetterCommand>()
            .ForMember(x => x.Id, opt => opt.MapFrom( o => Guid.NewGuid()))
            .ForMember(x => x.Created, opt => opt.MapFrom( o => DateTime.Now));

Ответ 3

Из того, что я понимаю из описания, является то, что вы не хотите запускать уведомление об изменении свойства при извлечении данных из db с помощью DO и заполнения BO.

Одним из возможных решений для этого было бы иметь базовый класс для всех BO, имеющих две основные функции: 1. Свойство - IsLoaded, которое будет установлено картографом после загрузки данных и 2. Внедрение INotifyPropertyChange и способ обертывания издателя RaisePropertyChange, чтобы проверить свойство IsLoaded и поднять это событие на основе этого.