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.IPagedList1[[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?
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
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. –