AutoMapper自定义类型转换器无法正常工作

Bri*_*ord 9 automapper automapper-2

我正在使用Troy Goode的PagedList在我的WebApi中提供分页信息.他的包返回一个实现IEnumerable的IPagedList,但也包含自定义属性,如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; }
}
Run Code Online (Sandbox Code Playgroud)

由于我将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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的配置中将其设置为:

Mapper.CreateMap<IPagedList<Department>, PagedViewModel<Department>>().ConvertUsing(new PagedListTypeConverter<Department>());
Run Code Online (Sandbox Code Playgroud)

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

var x = Mapper.Map<IPagedList<Department>, PagedViewModel<Department>>(departments);
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

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

映射类型:IPagedList 1 -> PagedViewModel1 PagedList.IPagedList 1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> Provision.DomainObjects.PagedViewModel1 [[Provision.DomainObjects.Department,Provision.DomainObjects,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]

目标路径:PagedViewModel`1

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

我怎样才能做到这一点?

Bri*_*ord 2

拔掉头发后,我终于弄清楚了这一点。代码没有任何问题。事实证明这是一个线程问题,配置的映射被清除。上面的代码是执行我想要的操作的正确方法。我将其留在这里,以便我可以向需要做同样事情的其他人提出另一个问题。