使用AutoMapper映射父/子接口属性

本文关键字:接口 属性 AutoMapper 映射 使用 | 更新日期: 2023-09-27 18:00:58

我在标准分层结构中使用了以下接口和DTO:

public interface IPageView {
    IPageView Parent { get; set; }
    ICollection<IPageView> Children { get; set; }
}

这是使用以下具体类实现的:

public class PageView : IPageView {
    IPageView Parent { get; set; }
    ICollection<IPageView> Children { get; set; }
}

为了简洁起见,我省略了其他属性和构造函数。我使用Automapper从我的Page EF POCO实体映射到接口DTO,如下所示:

AutoMapper.Mapper.CreateMap<Page, IPageView>().As<PageView>();

当AutoMapper尝试创建映射时,我得到以下异常:

无法映射Pipeline.CMS.Contracts.UI.IPageView上的以下属性:页码添加自定义映射表达式、忽略、添加自定义解析程序或修改目标类型Pipeline.CMS.Contracts.UI.IPageView。上下文:从Model.Page到Interfaces.PageView到属性Pages的映射从System.Collections.Generic.ICollection 1[[Model.Page,Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] to System.Collections.Generic.ICollection 1映射到属性Pages[[Interfaces.IPageView,Interfaces,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]从类型ModelPage映射到接口.IPageView引发了类型为"AutoMapper.AutoMapperConfigurationException"的异常。

显然,这是因为AutoMapper无法映射IPageView,因为它还没有映射!

我的问题是如何解决这个问题?我不介意在AutoMapper配置中指定一个具体的类。

使用AutoMapper映射父/子接口属性

上面的代码似乎还可以,问题与层次结构无关,但需要在原始源对象和As方法中的对象之间创建映射。对于以上内容,它将是:

AutoMapper.Mapper.CreateMap<Page, PageView>(); // Additional line here needed
AutoMapper.Mapper.CreateMap<Page, IPageView>().As<PageView>();