使用 Automapper 在继承和组合之间进行映射

问题描述 投票:0回答:1

我最近开始在我的工作项目中使用 Automapper 在数据库对象和业务对象之间进行映射。业务对象已经存在,并且它们的结构无法更改(不幸的是)。他们使用多级继承。在数据库方面,我有多个对象使用组合来模拟业务对象的结构层次结构。

大多数映射工作正常,但我很难在组合类和继承类之间进行映射。我举个例子;假设我有一个继承自类 B 的类 A,该类可能是抽象的,也可能不是抽象的。然后,在数据库方面,我有一个 ADbo 类(数据库对象),它有一个引用 BDbo 的属性。即

// Business layer objects
public class A : B
{
    public int SomeValue { get; set; }
}

public abstract class B
{
    public int OtherValue { get; set; }
}
// Database layer objects
public class ADbo
{
    public int SomeValue { get; set; }
    
    public BDbo Data { get; set; }
}

public class BDbo
{
    public int OtherValue { get; set; }
}

这些类的映射类似于:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<A, ADbo>().ReverseMap();
    cfg.CreatMap<B, BDbo>().ReverseMap();
});

AutoMapper 文档有映射继承和组合的示例,但没有从一个映射到另一个。我也在研究值转换器,但在没有配置配置的情况下无法弄清楚如何做到这一点。

那么,有没有人尝试过绘制这个奇怪案例的地图或知道我可以采取的可能路线?或者,这根本不在 AutoMapper 的处理能力范围内吗?

c# .net automapper ef-core-3.1
1个回答
0
投票

您可以使用

ForMember
方法告诉
automapper
任何特定属性的转换。例如:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<A, ADbo>().ForMember(P => P.Data, Opt => Opt.MapFrom(Q => new BDbo() { OtherValue = Q.OtherValue }));
});

对于

BDbo
,你不需要额外的东西,只要它们的属性名称和类型完全相同即可。

© www.soinside.com 2019 - 2024. All rights reserved.