自动映射器 - 可插拔映射



我需要实现一个可插拔的系统,其中自动映射器配置文件可以由许多DLL提供。

要映射的对象具有人员列表:

public class CompanySrc
{
public List<PersonSrc> Persons {get;set;}
}
public class CompanyDest
{
public List<PersonDest> Persons {get;set;}
}

PersonSrc 和 PersonDest 是可以在每个 DLL 中扩展的抽象类:

DLL1:

public class EmployeeSrc : PersonSrc
{
...
}

public class EmployeeDest : PersonDest
{
...
}

DLL2:

public class ManagerSrc : PersonSrc
{
...
}

public class ManagerDest : PersonDest
{
...
}

这个想法是实现类似于这样的东西:

public class DLL1Profile : Profile
{
public DLL1Profile()
{
CreateMap<PersonSrc, PersonDest>()
.Include<EmployeeSrc, EmployeeDest>();
CreateMap<EmployeeSrc, EmployeeDest>();
}
}

public class DLL2Profile : Profile
{
public DLL2Profile()
{
CreateMap<PersonSrc, PersonDest>()
.Include<ManagerSrc, ManagerDest>();
CreateMap<ManagerSrc, ManagerDest>();
}
}

映射按以下方式完成

var mc = new MapperConfiguration(cfg =>
{
cfg.CreateMap<CompanySrc, CompanyDest>()
cfg.AddProfile(new DLL1Profile());
cfg.AddProfile(new DLL2Profile ());
});
IMapper sut = mc.CreateMapper();
var result = sut.Map<CompanyDest>(companySrc);

但这种方法行不通。当"人员"列表包含员工和经理时,我尝试映射整个列表时,我得到一个例外。 有什么建议吗?

您看到此问题是因为您有多个调用CreateMap<PersonSrc, PersonDest>()- 只能存在一个映射。

在不同的DLL 中扩展基类时,不要使用.Include,请改用.IncludeBase。 Include 要求包含基类的配置文件能够引用派生类,这很可能不是您想要发生的。

您应该在某个常见的地方定义基本映射,大概是定义 Person 的位置:

CreateMap<PersonSrc, PersonDest>();

在 DLL1 配置文件等中,请改用IncludeBase

CreateMap<ManagerSrc, ManagerDest>()
.IncludeBase<PersonSrc, PersonDest>();

相关内容

  • 没有找到相关文章

最新更新