AutoMapper:手动设置属性

我使用AutoMapper从平面DataObjects映射到胖BusinessObjects,反之亦然。 我注意到,由于BusinessObjects的更改通知(使用自定义validation实现INotifyPropertyChanged等),从DataObjects到BusinessObjects的映射需要额外的时间。

因为我在映射期间通常不需要更改通知,所以我想将其关闭。 所以我添加了一个属性“IsPropertyChangedEnabled”。 如果此属性设置为false,则不会引发NotifyPropertyChanged事件并保存时间。

题:

我可以告诉AutoMapper在映射过程的最开始将此属性设置为false吗? 如果是这样,怎么样?

谢谢!

使用BeforeMap方法在映射过程之前设置属性值:

 Mapper.CreateMap() .BeforeMap((s, d) => d.IsPropertyChangedEnabled = false ); 

您还可以使用ForMember(),当设置为值的属性不在源对象中时,它还具有传递Mapper.AssertConfigurationIsValid()的标准unit testing的额外好处。

这是一个例子

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

根据我的描述理解,您不希望在使用DO从填充数据库获取数据时触发属性更改通知。

一个可能的解决方案是为所有BO提供一个具有两个主要function的基类,1。属性 – 加载数据后由映射器设置的IsLoaded和2. INotifyPropertyChange实现和包装RaisePropertyChange发布者的方法检查IsLoaded属性并根据该属性引发事件。