2013-03-07 2 views
16

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

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

Вопрос:

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

Спасибо!

ответ

21

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

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

две минуты? Почему ты позволил мне так долго ждать? :-) P.S .: Метод «AfterMap» Я нашел себя P.P.S .: Спасибо! – user2145393

+1

BTW вы можете использовать 'AfterMap', чтобы активировать сбор событий после инициализации свойств. –

+0

для меня это вызывает ошибку: «дерево выражений не может содержать оператор присваивания». почему вы не получили эту ошибку? –

0

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

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

+0

Хм, все еще думая об этом. В конструкторе я использовал свойство propertychanged-event для запуска проверки и, таким образом, недействил все поля, которые не были равны нулю, и т. Д. Когда свойство было установлено (с или без AutoMapper), свойствоchanged-event снова было поднято, произошла повторная проверка и все было хорошо. Теперь повторная проверка не происходит, потому что я включаю, если отключить использование BeforeMap Automapper. Stil должен думать о том, как я лучше всего разрешаю это. – user2145393

10

Вы также можете использовать функцию ForMember(), которая имеет дополнительное преимущество для прохождения стандартного модульного теста 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)); 
+2

Просто хотел предупредить, что 'UseValue()' приводит к отображению статического значения. Поэтому в ответе здесь «GenerateClientLetterCommand.Created» всегда будет установлен на одно значение «DateTime» с момента инициализации AutoMapper даже при повторных вызовах! Похоже на ошибку с этим, поэтому хотел, чтобы это было. –

+0

Этот метод отлично работает для свойств 'private set' – Red