2013-03-07 19 views
16

AutoMapperを使用して、フラットDataObjectsからファットBusinessObjectsにマップしたり、その逆もあります。私は、DataObjectsからBusinessObjectsへのマッピングに、BusinessObjectsの変更通知(カスタム検証などでINotifyPropertyChangedを実装するため)に余分な時間がかかることに気付きました。AutoMapper:手作業で設定したプロパティ

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

質問:

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

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

答えて

21

使用マッピング処理の前にプロパティ値を設定するBeforeMap方法:

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

2分ですか?なぜ私はそれを待っていたのですか? :-) P .:私が見つけた "AfterMap"メソッド P.P.S .:ありがとう! – user2145393

+1

ところで、AfterMapを使って、プロパティが初期化された後でイベントを発生させることができます。私にとっては –

+0

これはエラーを引き起こします: "式ツリーに代入演算子を含めることはできません"。なぜこのエラーが出ませんでしたか? –

0

私は説明から理解するものから、あなたはDOを使用してDBからデータをフェッチしながら、プロパティの変更通知を発射したくないということですBOを充填する。

2つの主要な機能を持つすべてのBOの基本クラスを持つことが、1つの可能な解決策です。1.データがロードされた後にマッパーによって設定されるProperty - IsLoaded。2. INotifyPropertyChange実装とRaisePropertyChangeパブリッシャをラップしてIsLoadedプロパティを確認し、それに基づいてイベントを発生させます。

+0

これはまだ考えています。コンストラクタでは、検証をトリガするためにpropertychanged-eventを発生させたため、nullにすることができないすべてのフィールドを無効にしました。プロパティが設定されたとき(AutoMapperの有無にかかわらず)、propertychanged-eventが再度発生し、すべてうまくいった。 AutomapperのBeforeMapを使用してオフにすると、再検証は行われません。 Stilは私がこれをどのようにして解決するかについて考える必要があります。 – user2145393

10

また、値に設定されているプロパティがソースオブジェクトにない場合、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)); 
+2

'UseValue()'は、静的な値がマップされることを警告したかっただけです。ですから、ここでの答えでは、 'GenerateClientLetterCommand.Created'は、AutoMapperが初期化されたときから、繰り返しの呼び出しであっても、常に単一の' DateTime'値に設定されます!それにバグがありましたので、そのようにしてください。 –

+0

このメソッドは 'private set'プロパティ – Red

関連する問題