Automapper - 可插拔映射

时间:2017-07-10 08:25:02

标签: c# .net automapper automapper-5

我需要实现一个可插拔系统,其中许多DLL都可以提供Automapper配置文件。

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

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);

但这种方法不起作用。什么时候&#34;人民&#34; list包含一个Employee和一个Manager,我尝试映射整个列表,我得到一个例外。     有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

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

你应该在一个常见的地方定义基本映射,大概是在定义了Person的地方:

CreateMap<PersonSrc, PersonDest>();

在您的DLL1个人资料等中,请改用IncludeBase

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