我使用AutoMapper从平面DataObjects映射到胖BusinessObjects,反之亦然。我注意到,由于BusinessObjects的更改通知(使用自定义验证实现INotifyPropertyChanged等),从DataObjects到BusinessObjects的映射需要额外的时间。
因为我在映射期间通常不需要更改通知,所以我想将其关闭。所以我添加了一个属性“IsPropertyChangedEnabled”。如果此属性设置为false,则不会引发NotifyPropertyChanged事件并保存时间。
问题:
我可以告诉AutoMapper在映射过程的最开始将此属性设置为false吗?如果是这样,怎么样?
谢谢!
答案 0 :(得分:28)
使用BeforeMap
方法在映射过程之前设置属性值:
Mapper.CreateMap<Source, Destination>()
.BeforeMap((s, d) => d.IsPropertyChangedEnabled = false );
答案 1 :(得分:18)
您还可以使用ForMember(),当设置为值的属性不在源对象中时,它还具有传递Mapper.AssertConfigurationIsValid()的标准单元测试的额外好处。
这是一个例子
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 :(得分:0)
根据我的描述理解,您不希望在使用DO从填充数据库获取数据时触发属性更改通知。
一个可能的解决方案是为所有BO提供一个具有两个主要功能的基类,1。属性 - 加载数据后由映射器设置的IsLoaded和2. INotifyPropertyChange实现和包装方法RaisePropertyChange发布者检查IsLoaded属性并根据该属性引发事件。