AutoMapper:手动设置属性
我正在使用AutoMapper从平面DataObjects映射到胖BusinessObjects,反之亦然。 我注意到从DataObjects到BusinessObjects的映射需要额外的时间,因为BusinessObjects的更改通知(使用自定义验证实现INotifyPropertyChanged等)。
因为在映射过程中我通常不需要更改通知,所以我想关闭它。 所以我添加了一个属性“IsPropertyChangedEnabled”。 如果此属性设置为false,则不会引发NotifyPropertyChanged事件并保存时间。
题:
我可以告诉AutoMapper在映射过程的开始时将此属性设置为false吗? 如果是这样,怎么样?
谢谢!
使用BeforeMap
方法在映射过程之前设置属性值:
Mapper.CreateMap<Source, Destination>()
.BeforeMap((s, d) => d.IsPropertyChangedEnabled = false );
您还可以使用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));
从我所了解的描述中可以看出,您不想在使用DO从数据库获取数据并填充BO时触发属性更改通知。
一个可能的解决方案是为所有BO提供基类,其中包含两个主要功能,1.属性 - IsLoaded,将在数据加载后由映射器设置,以及2. INotifyPropertyChange实现和用于包装RaisePropertyChange发布者的方法检查IsLoaded属性并基于此引发事件。
链接地址: http://www.djcxy.com/p/37349.html上一篇: AutoMapper: manually set property
下一篇: Automapper: Mapping a property value of an object to a string