如何构建AutoMapper映射以在目标类构造函数

时间:2016-02-23 17:10:02

标签: automapper

如果我有这组源类,那该怎么办:

namespace Source {

    class CA
    {
        public CB B { get; set; }
    }

    class CB {}

}

目标类集的唯一区别是CB在构造函数中接受CA引用(CA具有相同的结构):

namespace Destination {

    class CA
    {
       public CB B { get; set; }
    }

    class CB
    {
       public CB(CA parent) { ... }
    }
}

如何使用AutoMapper为这些类构建静态映射?我的意思是对整个应用程序运行一次,而不是每个CA,CB实例。

我知道在每个具有CA目标实例的映射之前,我都可以像这样动态地执行它:

var config = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);

config.CreateMap<Source.CB, Destination.CB>()
        .ConstructUsing((ResolutionContext cntx) => 
            new Destination.CB(instanceOfCADestination));

但由于性能问题,这对我不起作用。

1 个答案:

答案 0 :(得分:4)

除了在映射之前实例化CA之外,找不到更好的方法,将其存储到IMappingOperationOptions.Options.Items集合中并在ConstructUsing中拾取

Mapper.CreateMap<Source.CB, Destination.CB>()
      .ConstructUsing(cntx => 
              new Destination.CB((Destination.CA)cntx.Options.Items["CADestRef]));

var destCAInstance = new Destination.CA();

var destCBInstance = 
       Mapper.Map<Destination.CB>(Source.CB, 
                                  opts => opts.Items["CADestRef"] = destCAInstance);

这样我可以将整个映射保持为静态。 我个人不喜欢这个解决方案,但它确实有效。如果你知道更好,请告诉我。