AutoMapper:手动设置属性

时间:2013-03-07 17:32:32

标签: c# automapper

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

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

问题:

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

谢谢!

3 个答案:

答案 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属性并根据该属性引发事件。

相关问题