Sto provando a utilizzare le proiezioni di Automapper su IQueryables di Entity Framework.Automapper 4.2.1 Le proiezioni LINQ funzionano solo con static Mapper.CreateMap?
All'avvio dell'applicazione, creo e aggiungo tutti i miei profili di mappatura che creano mappe con il metodo CreateMap non statico.
Tutti questi profili sono registrati nel mio contenitore IoC.
Ottengo l'eccezione di mappatura mancante anche se vedo il profilo di mappatura nell'istanza del mio mappingConfiguration.
Quale potrebbe essere il problema? Mi sto perdendo qualcosa? Sto usando Automapper 4.2.1
Ho notato che quando si aggiunge un Mapper.CreateMap statico, funziona bene. Le proiezioni funzionano solo con l'API statica? Voglio evitare l'API statica.
codice completo:
public class ItemEntityToItemView : Profile
{
public override void Configure()
{
CreateMap<ItemEntity, ItemView>();
// Without this line, I get missing Map type configuration.
Mapper.CreateMap<ItemEntity, ItemView>();
}
}
public interface IEntitiesProjector
{
IQueryable<T> SelectTo<T>(IQueryable source);
}
public class EntitiesProjector : IEntitiesProjector
{
private readonly IMapperConfiguration _mapperConfig;
public EntitiesProject(IMapperConfiguration mapperConfig)
{
_mapperConfig = mapperConfig;
}
public IQueryable<T> SelectTo<T>(IQueryable source)
{
return source.ProjectTo<T>(_mapperConfig);
}
}
public class ItemsRepository : IITemsRepository
{
public IQueryable<ItemEntity> GetById(int id)
{
return _dbSet.Where(x => x.Id == id);
}
}
public class Service
{
private readonly IEntitiesProjector _projector;
public Service(IEntitiesProject entitiesProjector)
{
_projector = entitiesProjector;
}
public List<T> GetItem(int id)
{
IQueryable<ItemEntity> itemsQueryable = ItemsRepository.GetById(id);
return _projector.SelectTo<ItemView>(itemsQueryable);
}
}
My Autofac registration :
builder.RegisterAssemblyTypes().AssignableTo(typeof(Profile)).As<Profile>();
builder.Register(c => new MapperConfiguration(cfg =>
{
cfg.CreateMap<IdentityUser, AspNetUser>().ReverseMap();
})).AsSelf().As<IMapperConfiguration>().SingleInstance();
builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();
builder.Register<EntitiesProjector>().As<IEntitiesProjector>().SingleInstance();
inserisci il tuo codice campione –
Aggiunto il mio profilo .. si suppone che funzioni? O è noto che le proiezioni funzionano solo quando si utilizza l'API statica? –
Quando uso 'ProjectTo()', devo aggiungere un parametro di tipo generico e fornire una configurazione del mapper come parametro. Ne hai di più nel tuo codice di domanda molto incompleto. Btw: Sto usando 'utilizzando AutoMapper.QueryableExtensions;' per ottenere le mie estensioni di sovraccarico 'ProjectTo' – grek40