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