2012-09-18 12 views
8

Estoy usando Troy Goode's PagedList para proporcionar información de paginación en mi WebApi. Su paquete devuelve un IPagedList que implementa IEnumerable pero también contiene propiedades personalizadas como IsLastPage, PageNumber, PageCount, etc.AutoMapper convertidor de tipo personalizado no funciona

Cuando intenta devolver esta clase desde un método de controlador WebApi (como el GET), el enumerable se serializa , pero las propiedades personalizadas no lo son Por lo tanto, pensé que iba a utilizar AutoMapper y escribir un convertidor de tipo personalizado para convertir a una clase como esta:

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

Desde muevo el Enumerable en una propiedad distinta, la serialización maneja a la perfección. Por lo tanto, me senté y escribí un convertidor de tipo personalizado como esto:

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

Y luego otra vez en mi configuración como ésta:

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

embargo, cuando intento llamarlo así:

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

me sale este error:

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]

¿Cómo puedo hacer que esto funcione?

Respuesta

1

Después de sacarme el pelo, finalmente me di cuenta de esto. No hay nada malo en el código. Resultó ser un problema de subprocesamiento donde las asignaciones configuradas se estaban eliminando. El código anterior es la forma correcta de hacer lo que yo quería. Dejo esto aquí para poder señalarle otra pregunta a otros que necesitan hacer lo mismo.

+1

Buen trabajo Brian. ¿Puede decirme un poco más sobre el problema de enhebrado que estaba teniendo? Estoy usando el código y quiero asegurarme de que puedo solucionar los problemas que puedan surgir. – maguy

+0

Ojalá pudiera recordar, pero después de un año, no tengo ni idea. Recuerdo, sin embargo, que fue algo realmente estúpido lo que hice, así que dudo que lo encuentres. –

Cuestiones relacionadas