34

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

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

问题:

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

谢谢!

4

3 回答 3

46

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

Mapper.CreateMap<Source, Destination>()
      .BeforeMap((s, d) => d.IsPropertyChangedEnabled = false );
于 2013-03-07T17:46:25.487 回答
44

您还可以使用 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));

根据条件赋值

Mapper.CreateMap<ClientData, GenerateClientLetterCommand>()
            .ForMember(x => x.Gender, opt => opt.MapFrom( o => o.Gender == 0 ? "Male" : "Female"));
于 2014-03-26T14:52:40.500 回答
0

根据我从描述中了解到的是,您不想在使用 DO 从 db 获取数据并填充 BO 时触发属性更改通知。

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

于 2013-03-07T17:52:35.570 回答