【问题标题】:AutoMapper Custom Type Converter not workingAutoMapper 自定义类型转换器不起作用
【发布时间】:2012-09-10 07:30:03
【问题描述】:

我正在使用Troy Goode's PagedList 在我的 WebApi 中提供分页信息。他的包返回一个 IPagedList,它实现了 IEnumerable,但还包含自定义属性,例如 IsLastPage、PageNumber、PageCount 等。

当您尝试从 WebApi 控制器方法(例如 GET)返回此类时,Enumerable 会被序列化,但自定义属性不会。所以,我想我会使用 AutoMapper 并编写一个自定义类型转换器来转换为这样的类:

public class PagedViewModel<T>
{
    public int FirstItemOnPage { get; set; }
    public bool HasNextPage { get; set; }
    public bool HasPreviousPage { get; set; }
    public bool IsFirstPage { get; set; }
    public bool IsLastPage { get; set; }
    public int LastItemOnPage { get; set; }
    public int PageCount { get; set; }
    public int PageNumber { get; set; }
    public int PageSize { get; set; }
    public int TotalItemCount { get; set; }
    public IEnumerable<T> rows { get; set; }
}

由于我将 Enumerable 移动到一个不同的属性中,因此序列化可以完美地处理它。所以,我坐下来写了一个这样的自定义类型转换器:

public class PagedListTypeConverter<T> : ITypeConverter<IPagedList<T>, PagedViewModel<T>>
{
    public PagedViewModel<T> Convert(ResolutionContext context)
    {
        var source = (IPagedList<T>)context.SourceValue;
        return new PagedViewModel<T>()
        {
            FirstItemOnPage = source.FirstItemOnPage,
            HasNextPage = source.HasNextPage,
            HasPreviousPage = source.HasPreviousPage,
            IsFirstPage = source.IsFirstPage,
            IsLastPage = source.IsLastPage,
            LastItemOnPage = source.LastItemOnPage,
            PageCount = source.PageCount,
            PageNumber = source.PageNumber,
            PageSize = source.PageSize,
            TotalItemCount = source.TotalItemCount,
            rows = source
        };
    }
}

然后在我的配置中这样设置:

Mapper.CreateMap<IPagedList<Department>, PagedViewModel<Department>>().ConvertUsing(new PagedListTypeConverter<Department>());

但是,当我尝试这样称呼它时:

var x = Mapper.Map<IPagedList<Department>, PagedViewModel<Department>>(departments);

我收到此错误:

缺少类型映射配置或不支持的映射。

映射类型:IPagedList1 -&gt; PagedViewModel1 PagedList.IPagedList1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> Provision.DomainObjects.PagedViewModel1[[Provision.DomainObjects.Department, Provision.DomainObjects,版本=1.0.0.0,文化=中性, PublicKeyToken=null]]

目标路径:PagedViewModel`1

来源价值: PagedList.StaticPagedList`1[Provision.DomainObjects.Department]

我怎样才能做到这一点?

【问题讨论】:

    标签: automapper automapper-2


    【解决方案1】:

    拔掉头发后,我终于想出了这个。代码没有任何问题。结果是一个线程问题,配置的映射被清除了。上面的代码是做我想做的事情的正确方法。我把这个留在这里,以便我可以为需要做同样事情的其他人指出另一个问题。

    【讨论】:

    • 干得好,布赖恩。你能告诉我更多关于你遇到的线程问题吗?我正在使用该代码,并希望确保我可以解决可能出现的任何问题。
    • 我希望我能记得,但一年后,我不知道了。然而,我确实记得,这是我做过的一件非常愚蠢的事情,所以我怀疑你会遇到它。
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2016-01-13
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多