web-dev-qa-db-fra.com

AutoMapper: propriété définie manuellement

J'utilise AutoMapper pour mapper des objets de données plats en objets de BusinessObjects, et inversement. J'ai remarqué que le mappage de DataObjects vers BusinessObjects prend du temps supplémentaire en raison de la notification de modification de BusinessObjects (implémente INotifyPropertyChanged avec une validation personnalisée, etc.).

Comme je n'ai normalement pas besoin de notification de changement pendant le mappage, j'aimerais le désactiver. J'ai donc ajouté une propriété "IsPropertyChangedEnabled". Si cette propriété est définie sur false, aucun événement NotifyPropertyChanged n'est déclenché et le temps est enregistré.

Question: 

Puis-je dire à AutoMapper de définir cette propriété sur false au tout début du processus de mappage? Si c'est le cas, comment?

Je vous remercie!

20
user2145393

Utilisez la méthode BeforeMap pour définir la valeur de la propriété avant le processus de mappage:

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

Vous pouvez également utiliser ForMember (), qui présente l'avantage supplémentaire de réussir le test unitaire standard de Mapper.AssertConfigurationIsValid () lorsque les propriétés définies comme valeurs ne figurent pas dans l'objet source.

voici un exemple

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

D'après ce que j'ai compris de la description, vous ne voulez pas déclencher la notification de modification de propriété lorsque vous extrayez des données de la base de données en utilisant le DO et en remplissant le BO. 

Une solution possible consiste à avoir une classe de base pour tous les BO ayant deux fonctionnalités principales: 1. Property - IsLoaded, qui sera défini par le mappeur une fois les données chargées, et 2. Implémentation INotifyPropertyChange et une méthode pour emballer l'éditeur RaisePropertyChange. pour vérifier la propriété IsLoaded et déclencher l'événement en fonction de cela.

0
Chinjoo