web-dev-qa-db-ja.com

AutoMapper:プロパティを手動で設定

AutoMapperを使用して、フラットなDataObjectからFat BusinessObjectに、またはその逆にマップしています。 BusinessObjectsの変更通知(カスタム検証によるINotifyPropertyChangedの実装など)が原因で、DataObjectsからBusinessObjectsへのマッピングに余分な時間がかかることに気付きました。

通常、マッピング中に変更通知は必要ないので、オフにしたいと思います。そこで、プロパティ「IsPropertyChangedEnabled」を追加しました。このプロパティがfalseに設定されている場合、NotifyPropertyChangedイベントは発生せず、時間が節約されます。

質問:

マッピングプロセスの最初にこのプロパティをfalseに設定するようにAutoMapperに指示できますか?もしそうなら、どうですか?

ありがとうございました!

28
user2145393

マッピングプロセスの前にBeforeMapメソッドを使用してプロパティ値を設定します。

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

値に設定されているプロパティがソースオブジェクトにない場合に、Mapper.AssertConfigurationIsValid()の標準単体テストに合格するという追加の利点を持つForMember()を使用することもできます。

ここに例があります

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

説明から私が理解していることから、DOを使用してBOにデータを入力し、dbからデータをフェッチしている間は、プロパティ変更通知を発行したくないということです。

このための1つの可能な解決策は、2つの主要な機能を持つすべてのBOの基本クラスを持つことです。1。プロパティ-IsLoaded。データが読み込まれた後にマッパーによって設定されます。 IsLoadedプロパティを確認し、それに基づいてイベントを発生させます。

0
Chinjoo