我想在實體框架IQueryables上使用Automapper投影。Automapper 4.2.1 LINQ投影僅適用於靜態Mapper.CreateMap?
在應用程序啓動時,我創建並添加了所有使用非靜態CreateMap方法創建映射的映射配置文件。
所有這些配置文件都在我的IoC容器中註冊。
雖然我在mappingConfiguration的實例中看到映射配置文件,但我得到了缺失的映射異常。
可能是什麼問題?我錯過了什麼嗎?我使用的Automapper 4.2.1
我注意到,當添加一個靜態的Mapper.CreateMap,它工作正常。預測僅適用於靜態API嗎?我想避免靜態API。
全碼:
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();
發佈您的代碼示例 –
添加我的個人資料..它應該工作嗎?或者是否知道投影僅在使用靜態API時才起作用? –
當我使用'ProjectTo()'時,我必須添加一個泛型類型參數並提供一個映射器配置作爲參數。你有非常不完整的問題代碼中的那些人。順便說一句:我使用'使用AutoMapper.QueryableExtensions;'爲了得到我的'ProjectTo'重載擴展 – grek40