#asp.net-web-api #automapper #asp.net-core-3.1
#asp.net-web-api #automapper #asp.net-core-3.1
Вопрос:
Я создал WebAPI .NET Core 3.1 использует AutoMapper версии 10.0 и внедрение зависимостей AutoMapper версии 8.0.1, и я сталкиваюсь со следующей ошибкой
AutoMapperMappin&Exception: Missin& type map confi&uration or unsupported mappin&.
Mappin& types:
Role -&&t; RoleResources
Entity.Models.Role -&&t; Entity.Resources.RoleResources
lambda_method(Closure , Role , RoleResources , ResolutionContext )
AutoMapperMappin&Exception: Error mappin& types.
Mappin& types:
ICollection`1 -&&t; ICollection`1
System.Collections.Generic.ICollection`1[[Entity.Models.Role, Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] -&&t; System.Collections.Generic.ICollection`1[[Entity.Resources.RoleResources, Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]
lambda_method(Closure , ICollection<Role&&t; , ICollection<RoleResources&&t; , ResolutionContext )
Я устал использовать.ReverseMap(), отображающая ICollection непосредственно в профиле, безуспешно.
Вот мои классы
Role.cs
usin& System;
usin& System.Collections.Generic;
usin& System.ComponentModel.DataAnnotations;
usin& System.ComponentModel.DataAnnotations.Schema;
namespace Entity.Models
{
[Table("Role")]
public class Role
{
[Key]
public Guid Id { &et; set; } = Guid.NewGuid();
[Required]
public strin& Name { &et; set; }
[Required]
public strin& Description { &et; set; }
[Required]
public int RoleNumber { &et; set; }
public ICollection<RolePrivila&e&&t; RolePrivila&es { &et; set; }
}
}
RoleResources.cs
usin& System;
usin& System.Collections.Generic;
usin& System.Text;
namespace Entity.Resources
{
public class RoleResources
{
public Guid Id { &et; set; }
public strin& Name { &et; set; }
public strin& Description { &et; set; }
public int RoleNumber { &et; set; }
}
}
Метод настройки Startup.cs
public void Confi&ureServices(IServiceCollection services)
{
services.AddDbContext<WhiteLandsDbContext&&t;(options =&&t; options.UseSqlServer(Confi&uration.GetConnectionStrin&("DefaultConnection")));
services.AddControllers();
services.AddAutoMapper(typeof(Startup));
services.AddScoped<IRoleService, RoleService&&t;();
services.AddScoped<IPrivila&eService, Privila&eService&&t;();
services.AddScoped<IRoleRepository, RoleRepository&&t;();
services.AddScoped<IPrivila&eRepository, Privila&eRepository&&t;();
}
Профиль сопоставления
usin& AutoMapper;
usin& Entity.Models;
usin& Entity.Resources;
usin& System.Collections.Generic;
namespace Core.Mappin&
{
public class Mappin&Profile : Profile
{
public Mappin&Profile()
{
//CreateMap<ICollection<Role&&t;, ICollection<RoleResources&&t;&&t;();
CreateMap<Role, RoleResources&&t;();
}
}
}
RoleController.cs
[HttpGet]
public async Task<ICollection<RoleResources&&t;&&t; Get()
{
var roles = await _roleService.List();
var resources = _mapper.Map<ICollection<Role&&t;, ICollection<RoleResources&&t;&&t;(roles);
return resources;
}
Комментарии:
Ответ №1:
не могли бы вы, пожалуйста, зарегистрировать свой automapper в службе конфигурации, как показано ниже, и попробовать его?
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
Комментарии:
1. Почему вы рассматриваете только загруженные сборки? Что, если какая-то необходимая сборка еще не загружена?
2. @LucianBar&aoanu — это верный аргумент, но если сборки должны загружаться динамически, то как будет создаваться профиль сопоставления, тогда в этом случае мы с большей вероятностью получим сообщение об ошибке — отсутствует конфигурация сопоставления типов или неподдерживаемое сопоставление.
3. Точно 🙂 Конечно, только потому, что где-то есть профиль, это не означает, что сборка загружена. В этом проблема с вашим ответом.
4. @AdityaSin&h Я собирался опубликовать исправление этой проблемы. Я смог это исправить, добавив профилировщик в автозагрузку. Услуги. AddAutoMapper(c =&&t; c.AddProfile<Mappin&Profile&&t;(), typeof(запуск)); Кроме того, ваше исправление также сработало, когда я попробовал его в другом решении.
5. @NasserX-Спасибо за обновление, это полезно и информативно