2012-09-18 87 views
8

我使用Troy Goode's PagedList在我的WebApi中提供分頁信息。他的程序包返回實現IEnumerable的IPagedList,但也包含自定義屬性,如IsLastPage,PageNumber,PageCount等。AutoMapper自定義類型轉換器不工作

當您試圖從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; } 
} 

因爲我移動可枚舉到一個不同的屬性,序列化處理它完美。所以,我坐下來,寫了一個自定義類型轉換是這樣的:

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

我得到這個錯誤:

Missing type map configuration or unsupported mapping.

Mapping types: IPagedList 1 -> PagedViewModel 1 PagedList.IPagedList 1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -> Provision.DomainObjects.PagedViewModel 1[[Provision.DomainObjects.Department, Provision.DomainObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

Destination path: PagedViewModel`1

Source value: PagedList.StaticPagedList`1[Provision.DomainObjects.Department]

我該如何做這項工作?

回答

1

把我的頭髮拉出來後,我終於明白了這一點。代碼沒有任何問題。事實證明,這是一個線程問題,其中配置的映射被清除。上面的代碼是做我想做的事的正確方法。我在這裏離開這裏,以便我可以爲需要做同樣事情的其他人提出另一個問題。

+1

不錯的工作布萊恩。你能告訴我更多關於你遇到的線程問題嗎?我使用的代碼,並希望確保我可以解決可能出現的任何問題。 – maguy

+0

我希望我能記住,但過了一年,我不知道。不過,我確實記得,這是我做過的非常愚蠢的事情,所以我懷疑你會遇到它。 –

相關問題