2016-11-22 107 views
0

.NET框架4.5.2,.Asp.NET网页API 5.2.3,5.1.1 AutoMapperMapper.Map <任务<IEnumerable的<Address>>,任务<IEnumerable的<AddressView>>()

我有以下ASP地址控制器上的.NET MVC WebApi操作方法。对于我的测试,我只返回10条记录,你可以在下面的服务的方法,请参阅:

[Route("api/Address/GetAllAsync")] 
[HttpGet] 
public async Task<IEnumerable<AddressModel>> GetAllAsync() 
{ 
    AddressService service = new AddressService(new DataContext()); 
    Task<IEnumerable<Address>> data = service.GetAllAddressesAsync(); 
    var addressList = Mapper.Map<Task<IEnumerable<Address>>, Task<IEnumerable<AddressModel>>>(data); 

    return await addressList; 
} 

service.GetAllAddressesAsync是

public async Task<IEnumerable<Address>> GetAlladdressesAsync() 
{ 
    var data = from a in _context.Addresses.Take(10) 
       orderby a.City 
       select a; 

    return await data.ToListAsync(); 
} 

AutoMapper在Global.asax.cs中配置为:

Mapper.Initialize(cfg => cfg.CreateMap<Address, AddressModel>()); 
Mapper.AssertConfigurationIsValid(); 

我也尝试配置AutoMapper像

Mapper.Initialize(cfg => cfg.CreateMap<Task<IEnumerable<Address>>, Task<IEnumerable<AddressModel>>>()); 
Mapper.AssertConfigurationIsValid(); 

第一次配置解决方案启动,但从浏览器调用GetAllAsync()方法时,响应正文(在F12 Developer Tools/Networking中)显示以下错误消息:

{“message”:“发生。“,”exceptionMessage“:”缺少类型映射配置或不支持映射。\ r \ n \ r \ n映射类型:\ r \ n任务1 -> Task 1 \ r \ nSystem.Threading.Tasks.Task 1[[System.Collections.Generic.IEnumerable 1 [[DataAccess.Address ,DataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]] - > System.Threading.Tasks.Task 1[[System.Collections.Generic.IEnumerable 1 [[TestAspNetIdentity .Models.AddressModel,TestAspNetIdentity,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],mscorlib,Version = 4.0.0.0,Culture = neutral, PublicKeyToken =“b77a5c561934e089”]“,”exceptionType“:”AutoMapper.AutoMapperMappingException“,”stackTrace“:”

当尝试AutoMapper的第二个配置时,解决方案启动,但调用方法时,请求死亡,没有任何响应或异常客户端或服务器上,并且浏览器在无限循环中等待响应。

我应该如何配置和使用AutoMapper来将Task<IEnumerable<MyTypeA>>映射到Task<IEnumerable<MyTypeB>>?我是否使用async-task-awayt用法做出一些基本的错误?有人有一个例子吗? 谢谢你的帮助。

问候 阿德里安

回答

2

你不应该试图映射一个任务 - 等待任务的结果,映射的是:

[Route("api/Address/GetAllAsync")] 
[HttpGet] 
public async Task<IEnumerable<AddressModel>> GetAllAsync() 
{ 
    AddressService service = new AddressService(new DataContext()); 
    IEnumerable<Address> data = await service.GetAllAddressesAsync(); 
    var addressList = Mapper.Map<IEnumerable<AddressModel>>(data); 

    return addressList; 
} 

而且,你不需要指定源类型映射时。

相关问题