1

我正在尝试使用 Automapper 将具有嵌套复杂属性的 Entityframework 对象展平为几个不同的模型,这些模型都从基类继承相同的公共属性,其简化版本如下:

public class EFObject {
    public int Id { get; set; }
    public int NestedId { get; set; }
    public virtual AnotherModel AnotherModel { get; set; }
}

public class AModel : Model {
    public int AModelId { get; set; }
}

public class BModel : Model {
    public int BModelId { get; set; }
}

由于 AModel 和 BModel 理想地共享一个共同的基础(模型),我想像这样声明一个共同的地图:

mapper.Map<AnotherModel, Model>();

然后在将 EFObject 映射到 AModel 时,我会将 AModelId 属性映射到

mapper.Map<EFObject, AModel>();

然后包括 AnotherModel -> Model 映射,这样我就不必多次映射公共属性(一次用于 AModel,再次用于 BModel 等)。

我能够通过使用 AfterMap 来实现上述目标,即

CreateMap<EFObject, AModel>()
   .AfterMap((src, dest) => Mapper.Map(src.AnotherModel, dest))
   .ReverseMap();

但是,此解决方案存在一个相当大的问题,因为它依赖于 Automapper 的静态实例,并且由于我依赖注入 Automapper 的实例,因此由于未实例化静态 Mapper,我使用此映射的单元测试都失败了.

我可以通过在我的单元测试中初始化静态实例来解决这个问题,但是由于它需要了解你的地图的结构,它违背了使用 Automapper 的目的(我觉得)。

我也知道我可以为每个模型编写一个转换器,但这并不理想,因为它会为我认为受支持的东西产生很多额外的代码,但我正在努力寻找答案。

关于构建地图以解决此问题的最佳方法的任何想法?

4

0 回答 0