【问题标题】:AutoMapper AfterMap without Generics没有泛型的 AutoMapper AfterMap
【发布时间】:2012-12-18 01:49:06
【问题描述】:

我需要为AutoMapper 设置AfterMap,但我没有使用通用版本,因为我在运行时根据需要创建地图。如果我使用通用版本,我会这样做:

Mapper.CreateMap<DALEntity, BLLEntity>()
    .AfterMap((DALEntity dalEntity, BLLEntity bllEntity) =>
        (bllEntity as DomainEntityBase).State = DomainEntityState.Unchanged);

工作正常。直到运行时我才知道的其他地图是这样创建的:

Type BLLClassType = Type.GetType(BLLClassName);
Type DALClassType = Type.GetType(DALClassName);
Mapper.CreateMap(DALClassType, BLLClassType);

但现在我无法设置AfterMap。有什么建议么?我只需要在 AutoMapper 完成之后设置bllEntityState 属性。

【问题讨论】:

  • 我认为这不一定有帮助,但对于运行时映射,我认为您可以使用 Mapper.DynamicMap 而无需每次都创建映射。

标签: c# generics automapper


【解决方案1】:

创建自定义值解析器:

public class StateResolver : IValueResolver
{
    public ResolutionResult Resolve(ResolutionResult source)
    {
        return source.New(DomainEntityState.Unchanged);
    }
}

用法:

Type BLLClassType = Type.GetType(BLLClassName);
Type DALClassType = Type.GetType(DALClassName);

Mapper.CreateMap(DALClassType, BLLClassType)
      .ForMember("State", opt => opt.ResolveUsing<StateResolver>());

【讨论】:

  • 哦,有一个问题——在 AutoMapper 完成自己的复制后会运行吗?问题是自动映射器将触发 set State 的其他设置器 - 我需要在其他副本之后将状态重置为未更改。
  • @RBrowning99 我认为这将以相同的顺序运行,因为映射没有自定义设置的 State 属性。抱歉,得走了,几小时后回来
  • 嘿,我看了这个,它并没有改变发射顺序。调用类中的顺序似乎是字母顺序,然后是层次结构。我现在已经通过将我的 State 属性放在父类中来解决我的问题,所以它确实最后会着火,但我真的需要 AfterMap,因为我需要在地图之后发生这种情况。所以非通用版本不能使用 AfterMap 吗?最佳雷
  • @RBrowning99 据我所知,AfterMap 不适用于非泛型映射。考虑更改 State 属性的行为 - 不要在设置其他属性时更改它,而是根据其他属性值计算它。
【解决方案2】:

必须是AfterMap吗?例如,你能不能像这样使用UseValue

Mapper.CreateMap<DALEntity, BLLEntity>()
    .ForMember(dest => dest.State,
               opt => opt.UseValue(DomainEntityState.Unchanged));

【讨论】:

  • 直到运行时才知道类型 - 你不能使用这些泛型方法。
  • 您好,感谢您的快速回复。不必是 AfterMap - .ForMember 会很好 - 但我似乎也无法正确理解。您写的内容对我不起作用,因为您仍在使用泛型 - AfterMap 或 Formember 都可以使用泛型 - 但在这种情况下,我的类型是在运行时确定的: Mapper.CreateMap(DALClassType, BLLClassType);我尝试使用 ForMember,但似乎无法在其中进行类型转换,我认为我需要这样做。最佳雷
  • @Lazy 对不起,是的。我知道它是一个运行时问题,代码只是展示它如何工作的一个示例。我无法在此处查看它是否确实存在,不幸的是它看起来没有:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多