2012-09-18 8 views
8

Troy Goode's PagedListを使用して、WebApiにページング情報を提供しています。彼のパッケージはIEnumerableを実装するIPagedListを返しますが、IsLastPage、PageNumber、PageCountなどのカスタムプロパティも含みます。AutoMapperカスタムタイプコンバータが動作しない

このクラスをWebApiコントローラメソッド(GETなど)から返すと、Enumerableはシリアル化されますカスタムプロパティはそうではありません。私は個別のプロパティに列挙を移動するので、シリアライズは完全にそれを扱う

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

:だから、私はこのようなクラスに変換するにはAutoMapperを使用して、カスタム型コンバータを書くだろうと思いました。私はこのようにそれを呼び出すようにしようとすると、

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

しかし:だから、私は座って、このようなカスタム型コンバータを書いた:

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

そして、このように私の設定でそれを設定します。

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

私は覚えていればいいと思うが、1年後には手がかりがない。しかし、私がやったことは本当にばかげていることを覚えています。だからあなたはそれにぶつかるのではないかと思います。 –

関連する問題