升级到 9 后无法访问自动映射器上下文项

Mor*_*rse 2 c# automapper

我有一个这样的映射器:

CreateMap<Source, ICollection<Dest>>()
    .ConvertUsing((src, dst, context) => 
    {
        return context.Mapper.Map<ICollection<Dest>>
            (new SourceItem[] { src.Item1, src.Item2 ... }.Where(item => SomeFilter(item)),
            opts => opts.Items["SomethingFromSource"] = src.Something);
    });

CreateMap<SourceItem, Dest>()
    .ForMember(d => d.Something, opts => opts.MapFrom((src, dst, dstItem, context)
        => (string)context.Items["SomethingFromSource"]));
Run Code Online (Sandbox Code Playgroud)

这给了我一个例外的说法You must use a Map overload that takes Action<IMappingOperationOptions>。好吧,我确实使用了执行Map此操作的重载。我还能怎么做?

小智 9

这是因为这个变化:https :
//github.com/AutoMapper/AutoMapper/pull/3150

您可以通过访问 ResolutionContext 的 Options 属性来获取项目。

更改context.Items["SomethingFromSource"]context.Options.Items["SomethingFromSource"]

当没有 Items 时,ResolutionContext与 相同DefaultContext。因此该ResolutionContext.Items属性将抛出异常。
但是,如果有,则ResolutionContext.ItemsDefaultContext. 因此ResolutionContext.Items将返回列表。

虽然ResolutionContext.Options.Items将始终返回列表,但它不会抛出任何异常,无论它是否为空。我相信这是错误消息的意思,因为ResolutionContext.OptionsIMappingOperationOptions

  • 请注意,context.Options 在 AutoMapper 12 中已被删除 (6认同)
  • 工作完美,谢谢。context.Options.Items.ContainsKey(...) (2认同)

Mor*_*rse 0

使用内部映射器时的几点考虑(即context.Mapper

首先,尽量不要使用context.Mapper.Map<TDestination>(...),改为使用context.Mapper.Map<TSource, TDestination>(...),它的表现要好得多。

其次,在内部映射器中使用上下文会破坏封装。如果您需要设置内部对象中的值,请考虑以下两种解决方案:

如果您想在内部映射之后设置值

context.Mapper.Map<Source, Dest> (source, opts => opts.AfterMap((s, d) => 
    d.Something = source.Something))
Run Code Online (Sandbox Code Playgroud)

如果您想在内部地图之前设置值

context.Mapper.Map<Source, Dest> (source, new Dest()
    {
        Something = source.Something
    })
Run Code Online (Sandbox Code Playgroud)