2012-09-18 18 views
8

Tôi đang sử dụng Troy Goode's PagedList để cung cấp thông tin phân trang trong WebApi của tôi. Gói của anh ta trả về một IPagedList thực hiện IEnumerable nhưng cũng chứa các thuộc tính tùy chỉnh như IsLastPage, PageNumber, PageCount, v.v.Trình chuyển đổi loại tùy chỉnh AutoMapper không hoạt động

Khi bạn cố gắng trả về lớp này từ phương pháp điều khiển WebApi (chẳng hạn như GET), Enumerable được tuần tự hóa , nhưng các thuộc tính tùy chỉnh thì không. Vì vậy, tôi nghĩ rằng tôi sẽ sử dụng AutoMapper và viết một chuyển đổi kiểu tùy chỉnh để chuyển đổi sang một lớp học như thế này:

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

Kể từ khi tôi di chuyển Enumerable thành một tài sản riêng biệt, serialization xử lý nó một cách hoàn hảo. Vì vậy, tôi ngồi xuống và viết một kiểu tùy chỉnh chuyển đổi như thế này:

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

Và sau đó thiết lập nó trong cấu hình của tôi như thế này:

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

Tuy nhiên, khi tôi cố gắng gọi nó là như thế này:

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

tôi nhận được lỗi này:

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]

Tôi có thể thực hiện công việc này bằng cách nào?

Trả lời

1

Sau khi kéo tóc ra, cuối cùng tôi đã tìm ra điều này. Không có gì sai với mã. Nó bật ra được một vấn đề luồng nơi ánh xạ cấu hình đã được xóa ra. Đoạn mã trên là cách thích hợp để làm những gì tôi muốn. Tôi để cái này ở đây để tôi có thể chỉ ra một câu hỏi khác cho những người khác cần làm điều tương tự.

+1

Công việc tuyệt vời Brian. Bạn có thể cho tôi biết thêm một chút về vấn đề luồng mà bạn gặp phải không? Tôi đang sử dụng mã và muốn đảm bảo rằng tôi có thể khắc phục mọi sự cố có thể xảy ra. – maguy

+0

Tôi ước mình có thể nhớ, nhưng sau một năm, tôi không có đầu mối. Tôi nhớ, tuy nhiên, đó là một điều thực sự ngu ngốc tôi đã làm, vì vậy tôi nghi ngờ bạn sẽ chạy vào nó. –