2013-03-07 15 views
16

Używam programu AutoMapper do mapowania z płaskich obiektów DataObjects do grubych obiektów BusinessObjects i odwrotnie. Zauważyłem, że mapowanie z DataObjects do BusinessObjects zabiera więcej czasu z powodu powiadomienia o zmianie BusinessObjects (implementuje INotifyPropertyChanged z niestandardowym sprawdzaniem poprawności, itp.).AutoMapper: ręcznie ustawiona właściwość

Ponieważ zwykle nie potrzebuję powiadomienia o zmianie podczas mapowania, chciałbym go wyłączyć. Dodałem więc właściwość "IsPropertyChangedEnabled". Jeśli ta właściwość ma wartość false, żadne zdarzenie NotifyPropertyChanged nie jest wywoływane, a czas jest zapisywany.

Pytanie:

Mogę powiedzieć AutoMapper ustawić tę właściwość na wartość false na samym początku procesu mapowania? Jeśli tak to jak?

Dziękujemy!

Odpowiedz

21

Zastosowanie BeforeMap metodę ustalania wartości nieruchomości przed procesem mapowania:

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

dwie minuty? Dlaczego pozwoliłeś mi tak długo czekać? :-) P.S .: Metoda "AfterMap" Znalazłem się P.P.S .: Dziękuję! – user2145393

+1

BTW można użyć 'AfterMap', aby umożliwić podnoszenie zdarzeń po zainicjowaniu właściwości. –

+0

dla mnie to powoduje błąd: "drzewo wyrażeń nie może zawierać operatora przypisania". dlaczego nie dostałeś tego błędu? –

0

Z tego co rozumiem z opisu jest to, że nie chce odpalić powiadomienie o zmianie właściwość podczas pobierania danych z db przy użyciu DO i napełnianie BO.

Jednym z możliwych rozwiązań jest posiadanie klasy bazowej dla wszystkich BO posiadających dwie główne funkcje, 1. Właściwość - IsLoaded, która zostanie ustawiona przez program odwzorowujący po załadowaniu danych i 2. Implementacja INotifyPropertyChange i metoda zawiń wydawcę RaisePropertyChange, aby sprawdzić właściwość IsLoaded i na tej podstawie podnieść zdarzenie.

+0

Hm, wciąż o tym myślę. W konstruktorze użyłem podniesienia zdarzenia propertychowanego w celu aktywacji sprawdzania poprawności, a tym samym unieważnienia wszystkich pól, którym nie wolno było mieć wartości null, itp. Po ustawieniu właściwości (z lub bez AutoMappera) zdarzenie propertychanged zostało ponownie podjęte, nastąpiła ponowna walidacja i wszystko było w porządku. Teraz ponowna walidacja nie występuje, ponieważ wyłączam, jeśli jest wyłączona przy użyciu BeforeMap of Automapper. Muszę pomyśleć o tym, jak najlepiej to rozwiążę. – user2145393

10

Można również użyć metody ForMember(), która ma dodatkową zaletę, gdy przechodzi standardowy test jednostki Mapper.AssertConfigurationIsValid(), gdy właściwości ustawione na wartości nie znajdują się w obiekcie źródłowym.

oto przykład

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

Po prostu chciałem ostrzec, że 'UseValue()' powoduje odwzorowanie wartości statycznej. Więc w odpowiedzi tutaj, 'GenerateClientLetterCommand.Created' będzie zawsze ustawione na pojedynczą wartość' DateTime' od momentu zainicjowania AutoMapera, nawet w przypadku powtórnych wywołań! Zrobiono z tym błąd, więc chciałem, żeby to było. –

+0

Ta metoda działa doskonale dla właściwości 'private set' – Red

Powiązane problemy